[
  {
    "path": ".github/issue_label_bot.yaml",
    "content": "# for https://mlbot.net\nlabel-alias:\n  bug: 'kind/bug'\n  feature_request: 'kind/feature'\n  feature: 'kind/feature'\n  question: 'kind/question'\n"
  },
  {
    "path": ".github/workflows/kfctl_go_unittests.yaml",
    "content": "name: Unit Test\n\non:\n  - push\n  - pull_request\n\njobs:\n  build:\n    name: Test\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Check out repo\n      uses: actions/checkout@v2\n\n    - name: Unit Test\n      run: |\n        go test ./... -v 2>&1\n"
  },
  {
    "path": ".github/workflows/triage_issues.yaml",
    "content": "# Define a GitHub action workflow to determine whether issues \n# should be added or removed from the Needs Triage Kanban board.\nname: Check Triage Status of Issue\non:\n  issues:\n    types: [opened, closed, reopened, transferred, labeled, unlabeled]\n    # Issue is created, Issue is closed, Issue added or removed from projects, Labels added/removed\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Update Kanban\n        uses: kubeflow/code-intelligence/Issue_Triage/action@master\n        with:\n          # Letting input NEEDS_TRIAGE_PROJECT_CARD_ID use the default value\n          ISSUE_NUMBER: ${{ github.event.issue.number }}\n          GITHUB_PERSONAL_ACCESS_TOKEN: ${{ secrets.triage_projects_github_token }}\n\n"
  },
  {
    "path": ".gitignore",
    "content": "# pkg and bin directories currently contain build artifacts\n# only so we exclude them.\nbin/\nvendor/\n\n.vscode/\n\n# Compiled python files.\n*.pyc\n\n# Emacs temporary files\n*~\n\n# Other temporary files\n.DS_Store\n\n# temporary files from emacs flymd-mode\nflymd.*\n\n# vim .swp files\n*~\n*.swp\n*.swo\n\n# Files created by Gogland IDE\n.idea/\n\n# Exclude wheel files for now.\n# The only wheel file is the TF wheel one which is quite large.\n# We don't want to check that into source control because it could be\n# quite large.\n*.whl\n\n# Bazel files\n**/bazel-*\n# Examples egg\nexamples/tf_sample/tf_sample.egg-info/\nexamples/.ipynb_checkpoints/\n\n**/.ipynb_checkpoints\n\n# env.sh generated by kfctl.sh\n**/env.sh\n\n!testing/test-infra/vendor\n\n# This is required for testing but we don't\n# want to check it in right now.\ncomponents/gcp-click-to-deploy/src/user_config/**\n\n# This is generated by bootstrap\n**/reg_tmp\nscripts/gke/build/**\n"
  },
  {
    "path": "Dockerfile",
    "content": "#**********************************************************************\n# Builder\n# Create a go runtime suitable for building and testing kfctl\nARG GOLANG_VERSION=1.13.7\nFROM golang:$GOLANG_VERSION as builder\n\nARG BRANCH=master\nARG REPO=https://github.com/kubeflow/kubeflow\n\nRUN apt-get update\nRUN apt-get install -y git unzip jq vim\n\n# junit report is used to conver go test output to junit for reporting\nRUN go get -u github.com/jstemmer/go-junit-report\n\n# We need gcloud to get gke credentials.\nRUN if [ \"$(uname -m)\" = \"x86_64\" ]; then \\\n        cd /tmp && \\\n        wget -nv https://dl.google.com/dl/cloudsdk/release/install_google_cloud_sdk.bash && \\\n        chmod +x install_google_cloud_sdk.bash && \\\n        ./install_google_cloud_sdk.bash --disable-prompts --install-dir=/opt/; \\\n    fi\n\nENV PATH /go/bin:/usr/local/go/bin:/opt/google-cloud-sdk/bin:${PATH}\n\n# use go modules\nENV GO111MODULE=on\nENV GOPATH=/go\n# Workaround for https://github.com/kubernetes/gengo/issues/146\nENV GOROOT=/usr/local/go\n\n# Create kfctl folder\nRUN mkdir -p ${GOPATH}/src/github.com/kubeflow/kfctl\nWORKDIR ${GOPATH}/src/github.com/kubeflow\nRUN mkdir kubeflow\nRUN echo REPO=${REPO} branch=${BRANCH}\nRUN git clone ${REPO} --depth=1 --branch ${BRANCH} --single-branch kubeflow\nWORKDIR ${GOPATH}/src/github.com/kubeflow/kfctl\n\n# Download dependencies first to optimize Docker caching.\nCOPY go.mod .\nCOPY go.sum .\nRUN go mod download\n# Copy in the source\nCOPY . .\n\n#**********************************************************************\n#\n# kfctl_base\n#\nFROM builder as kfctl_base\n\nRUN make build-kfctl && \\\n    if [ \"$(uname -m)\" = \"aarch64\" ]; then \\\n        cp bin/arm64/kfctl bin/kfctl; \\\n    fi\n\n#**********************************************************************\n#\n# Final image base\n#\n\nFROM alpine:3.10.1 as barebones_base\nRUN mkdir -p /opt/kubeflow\nWORKDIR /opt/kubeflow\n\n#**********************************************************************\n#\n# kfctl\n#\nFROM barebones_base as kfctl\n\nCOPY --from=kfctl_base /go/src/github.com/kubeflow/kfctl/bin/kfctl /usr/local/bin\nCOPY --from=kfctl_base /go/src/github.com/kubeflow/kfctl/third_party /third_party\nCOPY --from=kfctl_base /go/pkg/mod /third_party/vendor\n\n\nCMD [\"/bin/bash\", \"-c\", \"trap : TERM INT; sleep infinity & wait\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 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": "Makefile",
    "content": "# Copyright 2017 The Kubernetes Authors.\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#\nGCLOUD_PROJECT ?= kubeflow-images-public\nGOLANG_VERSION ?= 1.13.7\nGOPATH ?= $(HOME)/go\n# To build without the cache set the environment variable\n# export DOCKER_BUILD_OPTS=--no-cache\nKFCTL_IMG ?= gcr.io/$(GCLOUD_PROJECT)/kfctl\nTAG ?= $(eval TAG := $(shell git describe --tags --long --always))$(TAG)\nREPO ?= $(shell echo $$(cd ../kubeflow && git config --get remote.origin.url) | sed 's/git@\\(.*\\):\\(.*\\).git$$/https:\\/\\/\\1\\/\\2/')\nBRANCH ?= $(shell cd ../kubeflow && git branch | grep '^*' | awk '{print $$2}')\nKFCTL_TARGET ?= kfctl\nMOUNT_KUBE ?=  -v $(HOME)/.kube:/root/.kube\nMOUNT_GCP ?=  -v $(HOME)/.config:/root/.config\n# set to -V\nVERBOSE ?=\nPLUGINS_ENVIRONMENT ?= $(GOPATH)/src/github.com/kubeflow/kfctl/bin\nexport GO111MODULE = on\nexport GO = go\nARCH ?= $(shell ${GO} env|grep GOOS|cut -d'=' -f2|tr -d '\"')\nOPERATOR_IMG ?= kubeflow-operator\nIMAGE_BUILDER ?= docker\nDOCKERFILE ?= Dockerfile\nOPERATOR_BINARY_NAME ?= $(shell basename ${PWD})\n\n# Location of junit file\nJUNIT_FILE ?= /tmp/report.xml\n\n%.so:\n\tcd cmd/plugins/$* && \\\n\t${GO} build -i -gcflags '-N -l' -o ../../../bin/$*.so -buildmode=plugin $*.go\n\n%.init:\n\t@echo kfctl init test/$* $(VERBOSE) --platform $* --project $(GCLOUD_PROJECT) --version master && \\\n\tPLUGINS_ENVIRONMENT=$(PLUGINS_ENVIRONMENT) kfctl init $(PWD)/test/$* $(VERBOSE) --platform $* --project $(GCLOUD_PROJECT) --version master\n\n%.init-no-platform:\n\t@echo kfctl init test/$* $(VERBOSE) --version master && \\\n\tkfctl init $(PWD)/test/$* $(VERBOSE) --version master\n\n%.generate:\n\t@echo kfctl generate all $(VERBOSE) '(--platform '$*')' && \\\n\tcd test/$* && \\\n\tPLUGINS_ENVIRONMENT=$(PLUGINS_ENVIRONMENT) kfctl generate all $(VERBOSE) --mount-local --email gcp-deploy@$(GCLOUD_PROJECT).iam.gserviceaccount.com\n\n%.md:\n\nall: build\n\nauth:\n\tgcloud auth configure-docker\n\n# Run go fmt against code\nfmt:\n\t@${GO} fmt ./config ./cmd/... ./pkg/...\n\n# Run go vet against code\nvet:\n\t@${GO} vet ./config ./cmd/... ./pkg/...\n\ngenerate:\n\t@${GO} generate ./config ./pkg/apis/apps/kfdef/... ./pkg/utils/... ./pkg/kfapp/minikube ./pkg/kfapp/gcp/... ./cmd/kfctl/...\n\n${GOPATH}/bin/deepcopy-gen:\n\tGO111MODULE=on ${GO} get k8s.io/code-generator/cmd/deepcopy-gen\n\nconfig/zz_generated.deepcopy.go: config/types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/config -O zz_generated.deepcopy \\\n\t-p config\n\npkg/apis/apps/kfdef/v1alpha1/zz_generated.deepcopy.go: pkg/apis/apps/kfdef/v1alpha1/application_types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/... -O zz_generated.deepcopy \\\n\t\t-p pkg/apis/apps/kfdef/v1alpha1/\n\npkg/apis/apps/kfdef/v1beta1/zz_generated.deepcopy.go: pkg/apis/apps/kfdef/v1beta1/application_types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/... -O zz_generated.deepcopy \\\n\t\t-p pkg/apis/apps/kfdef/v1beta1/\n\npkg/apis/apps/kfdef/v1/zz_generated.deepcopy.go: pkg/apis/apps/kfdef/v1/application_types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/... -O zz_generated.deepcopy \\\n\t\t-p pkg/apis/apps/kfdef/v1/\n\npkg/apis/apps/plugins/gcp/v1alpha1/zz_generated.deepcopy.go: pkg/apis/apps/plugins/gcp/v1alpha1/types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/gcp/... -O zz_generated.deepcopy \\\n\t\t-p pkg/apis/apps/plugins/gcp/v1alpha1/\n\npkg/apis/apps/plugins/aws/v1alpha1/zz_generated.deepcopy.go: pkg/apis/apps/plugins/aws/v1alpha1/types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/aws/... -O zz_generated.deepcopy \\\n\t\t-p pkg/apis/apps/plugins/aws/v1alpha1/\n\npkg/kfconfig/zz_generated.deepcopy.go: pkg/kfconfig/types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/kfconfig/... -O zz_generated.deepcopy \\\n\t\t-p pkg/kfconfig/\n\npkg/kfconfig/awsplugin/zz_generated.deepcopy.go: pkg/kfconfig/awsplugin/types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/kfconfig/awsplugin/... -O zz_generated.deepcopy \\\n\t\t-p pkg/kfconfig/awsplugin/\n\npkg/kfconfig/gcpplugin/zz_generated.deepcopy.go: pkg/kfconfig/gcpplugin/types.go\n\t${GOPATH}/bin/deepcopy-gen -h hack/boilerplate.go.txt -i github.com/kubeflow/kfctl/v3/pkg/kfconfig/gcpplugin/... -O zz_generated.deepcopy\\\n\t\t-p pkg/kfconfig/gcpplugin/\n\ndeepcopy: ${GOPATH}/bin/deepcopy-gen config/zz_generated.deepcopy.go \\\n\tpkg/apis/apps/kfdef/v1alpha1/zz_generated.deepcopy.go \\\n\tpkg/apis/apps/kfdef/v1beta1/zz_generated.deepcopy.go \\\n\tpkg/apis/apps/kfdef/v1/zz_generated.deepcopy.go \\\n\tpkg/apis/apps/plugins/gcp/v1alpha1/zz_generated.deepcopy.go \\\n\tpkg/apis/apps/plugins/aws/v1alpha1/zz_generated.deepcopy.go \\\n\tpkg/kfconfig/zz_generated.deepcopy.go \\\n\tpkg/kfconfig/awsplugin/zz_generated.deepcopy.go \\\n\tpkg/kfconfig/gcpplugin/zz_generated.deepcopy.go\n\nbuild: build-kfctl\n\nbuild-kfctl: deepcopy generate fmt vet\n\t# TODO(swiftdiaries): figure out import conflict errors for windows\n\t#CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ${GO} build -gcflags '-N -l' -ldflags \"-X main.VERSION=$(TAG)\" -o bin/windows/kfctl.exe cmd/kfctl/main.go\n\tCGO_ENABLED=0 GOOS=darwin GOARCH=amd64 ${GO} build -gcflags '-N -l' -ldflags \"-X main.VERSION=${TAG}\" -o bin/darwin/kfctl cmd/kfctl/main.go\n\tCGO_ENABLED=0 GOOS=linux GOARCH=amd64 ${GO} build -gcflags '-N -l' -ldflags \"-X main.VERSION=$(TAG)\" -o bin/linux/kfctl cmd/kfctl/main.go\n\tCGO_ENABLED=0 GOOS=linux GOARCH=arm64 ${GO} build -gcflags '-N -l' -ldflags \"-X main.VERSION=$(TAG)\" -o bin/arm64/kfctl cmd/kfctl/main.go\n\tCGO_ENABLED=0 GOOS=linux GOARCH=ppc64le ${GO} build -gcflags '-N -l' -ldflags \"-X main.VERSION=$(TAG)\" -o bin/ppc64le/kfctl cmd/kfctl/main.go\n\tcp bin/$(ARCH)/kfctl bin/kfctl\n\n# Fast rebuilds useful for development.\n# Does not regenerate code; assumes you already ran build-kfctl once.\nbuild-kfctl-fast: fmt vet\n\tCGO_ENABLED=0 GOOS=linux GOARCH=amd64 ${GO} build -gcflags '-N -l' -ldflags \"-X main.VERSION=$(TAG)\" -o bin/linux/kfctl cmd/kfctl/main.go\n\n# Release tarballs suitable for upload to GitHub release pages\nbuild-kfctl-tgz: build-kfctl\n\tchmod a+rx ./bin/kfctl\n\trm -f bin/*.tgz\n\tcd bin/linux && tar -cvzf kfctl_$(TAG)_linux.tar.gz ./kfctl\n\tcd bin/darwin && tar -cvzf kfctl_${TAG}_darwin.tar.gz ./kfctl\n\tcd bin/arm64 && tar -cvzf kfctl_${TAG}_arm64.tar.gz ./kfctl\n\tcd bin/ppc64le && tar -cvzf kfctl_${TAG}_ppc64le.tar.gz ./kfctl\n\nbuild-and-push-operator: build-operator push-operator\nbuild-push-update-operator: build-operator push-operator update-operator-image\n\n# Build operator image\nbuild-operator:\n\tgo mod vendor\n\t# Fix duplicated logrus library (Sirupsen/logrus and sirupsen/logrus) bug\n\t# due to the two different logrus versions that kfctl is using.\n\tpushd vendor/github.com/Sirupsen/logrus/ && \\\n\techo '\\\n\t// +build linux aix\\n\\\n\tpackage logrus\\n\\\n\timport \"golang.org/x/sys/unix\"\\n\\\n\tfunc isTerminal(fd int) bool {\\n\\\n\t\t_, err := unix.IoctlGetTermios(fd, unix.TCGETS)\\n\\\n\t\treturn err == nil\\n\\\n\t} ' > terminal_check_unix.go && \\\n\tpopd\nifneq ($(DOCKERFILE), Dockerfile)\n\tpushd build &&\\\n\tcp Dockerfile Dockerfile.bckp &&\\\n\tcp ${DOCKERFILE} Dockerfile &&\\\n\tpopd\nendif\n\tCGO_ENABLED=0 GOOS=linux GOARCH=amd64 ${GO} build -a -o build/_output/bin/$(OPERATOR_BINARY_NAME) cmd/manager/main.go\n\t${IMAGE_BUILDER} build build -t ${OPERATOR_IMG}\nifneq ($(DOCKERFILE), Dockerfile)\n\tpushd build &&\\\n\tcp Dockerfile.bckp Dockerfile &&\\\n\tpopd\nendif\n\n# push operator image and update deployment files.\npush-operator:\n\t${IMAGE_BUILDER} push ${OPERATOR_IMG}\n\nupdate-operator-image:\n\t# Use perl instead of sed to avoid OSX/Linux compatibility issue:\n\t# https://stackoverflow.com/questions/34533893/sed-command-creating-unwanted-duplicates-of-file-with-e-extension\n\tperl -pi -e 's@image: .*@image: '\"${OPERATOR_IMG}\"'@' ./deploy/operator.yaml\n\n# push the releases to a GitHub page\npush-to-github-release: build-kfctl-tgz\n\tgithub-release upload \\\n\t    --user kubeflow \\\n\t    --repo kubeflow \\\n\t    --tag $(TAG) \\\n\t    --name \"kfctl_$(TAG)_linux.tar.gz\" \\\n\t    --file bin/linux/kfctl_$(TAG)_linux.tar.gz\n\tgithub-release upload \\\n\t    --user kubeflow \\\n\t    --repo kubeflow \\\n\t    --tag $(TAG) \\\n\t    --name \"kfctl_$(TAG)_darwin.tar.gz\" \\\n\t    --file bin/darwin/kfctl_$(TAG)_darwin.tar.gz\n\tgithub-release upload \\\n            --user kubeflow \\\n            --repo kubeflow \\\n            --tag $(TAG) \\\n            --name \"kfctl_$(TAG)_arm64.tar.gz\" \\\n            --file bin/arm64/kfctl_$(TAG)_arm64.tar.gz\n\tgithub-release upload \\\n            --user kubeflow \\\n            --repo kubeflow \\\n            --tag $(TAG) \\\n            --name \"kfctl_$(TAG)_ppc64le.tar.gz\" \\\n            --file bin/ppc64le/kfctl_$(TAG)_ppc64le.tar.gz\n\nbuild-kfctl-container:\n\tDOCKER_BUILDKIT=1 docker build \\\n                --build-arg REPO=\"$(REPO)\" \\\n                --build-arg BRANCH=$(BRANCH) \\\n\t\t--build-arg GOLANG_VERSION=$(GOLANG_VERSION) \\\n\t\t--build-arg VERSION=$(TAG) \\\n\t\t--target=$(KFCTL_TARGET) \\\n\t\t--tag $(KFCTL_IMG)/builder:$(TAG) .\n\t@echo Built $(KFCTL_IMG)/builder:$(TAG)\n\tmkdir -p bin\n\tdocker create \\\n\t\t--name=temp_kfctl_container \\\n\t\t$(KFCTL_IMG)/builder:$(TAG)\n\tdocker cp temp_kfctl_container:/usr/local/bin/kfctl ./bin/kfctl\n\tdocker rm temp_kfctl_container\n\t@echo Exported kfctl binary to bin/kfctl\n\n# build containers using GCLOUD_PROJECT\nbuild-gcb:\n\tgcloud --project=$(GCLOUD_PROJECT)\\\n\t\tbuilds submit \\\n\t\t--machine-type=n1-highcpu-32 \\\n\t\t--substitutions=TAG_NAME=$(TAG)\n\t\t--config=cloudbuild.yaml .\n\n\n# Build but don't attach the latest tag. This allows manual testing/inspection of the image\n# first.\npush: build\n\tdocker push $(BOOTSTRAPPER_IMG):$(TAG)\n\t@echo Pushed $(BOOTSTRAPPER_IMG):$(TAG)\n\npush-latest: push\n\tgcloud container images add-tag --quiet $(BOOTSTRAPPER_IMG):$(TAG) $(BOOTSTRAPPER_IMG):latest --verbosity=info\n\techo created $(BOOTSTRAPPER_IMG):latest\n\npush-kfctl-container: build-kfctl-container\n\tdocker push $(KFCTL_IMG):$(TAG)\n\t@echo Pushed $(KFCTL_IMG):$(TAG)\n\npush-kfctl-container-latest: push-kfctl-container\n\tgcloud container images add-tag --quiet $(KFCTL_IMG):$(TAG) $(KFCTL_IMG):latest --verbosity=info\n\t@echo created $(KFCTL_IMG):latest\n\ninstall: build-kfctl dockerfordesktop.so\n\t@echo copying bin/kfctl to /usr/local/bin\n\t@cp bin/kfctl /usr/local/bin\n\nrun-kfctl-container: build-kfctl-container\n\tdocker run $(MOUNT_KUBE) $(MOUNT_GCP) --entrypoint /bin/sh -it $(KFCTL_IMG):$(TAG)\n\n#***************************************************************************************************\n# Build a docker container that can be used to build kfctl\n#\n# The rules in this section are used to build the docker image that provides\n# a suitable go build environment for kfctl\n\nbuild-builder-container:\n\tdocker build \\\n\t\t--build-arg GOLANG_VERSION=$(GOLANG_VERSION) \\\n\t\t--target=builder \\\n\t\t--tag $(KFCTL_IMG):$(TAG) .\n\t@echo Built $(KFCTL_IMG):$(TAG)\n\n# build containers using GCLOUD_PROJECT\nbuild-builder-container-gcb:\n\tgcloud --project=$(GCLOUD_PROJECT) \\\n\t\tbuilds submit \\\n\t\t--machine-type=n1-highcpu-32 \\\n\t\t--substitutions=TAG_NAME=$(TAG),_TARGET=builder \\\n\t\t--config=cloudbuild.yaml .\n\n#***************************************************************************************************\n\nclean:\n\trm -rf test && mkdir test\n\ndoc:\n\tdoctoc ./cmd/kfctl/README.md README.md k8sSpec/README.md developer_guide.md\n\n\n#**************************************************************************************************\n# checks licenses\ncheck-licenses:\n\t./third_party/check-license.sh\n# rules to run unittests\n#\ntest: build-kfctl check-licenses\n\tgo test ./... -v\n\n# Unit test invoked by Github Action\ngo-unittests-junit:\n\techo Running tests ... junit_file=$(JUNIT_FILE)\n\tmkdir -p $(JUNIT_DIR)\n\tgo test ./... -v 2>&1 | go-junit-report > $(JUNIT_FILE) --set-exit-code\n\n#***************************************************************************************************\ntest-init: clean install dockerfordesktop.init minikube.init gcp.init none.init-no-platform\n\ntest-generate: test-init dockerfordesktop.generate minikube.generate gcp.generate none.generate\n\ntest-apply: test-generate dockerfordesktop.apply minikube.apply gcp.apply none.apply\n\n"
  },
  {
    "path": "OWNERS",
    "content": "approvers:\n  - adrian555\n  - animeshsingh\n  - crobby\n  - Jeffwan\n  - PatrickXYS\n  - vpavlin\n  - yanniszark\nreviewers:\n  - adrian555\n  - pdmack\n  - tomcli\n"
  },
  {
    "path": "README.md",
    "content": "# kfctl\n\n_kfctl_ is the control plane for deploying and managing Kubeflow. The primary mode of deployment is to use [kfctl as a CLI](https://github.com/kubeflow/kfctl/tree/master/cmd/kfctl) with KFDef configurations for different Kubernetes flavours to deploy and manage Kubeflow. Please also look at the docs on [Kubeflow website](https://www.kubeflow.org/docs/started/getting-started/) for deployments options for different cloud providers\n\nAdditionally, we have also introduced [Kubeflow Operator](./operator.md) in incubation mode, which apart from deploying Kubeflow, will perform additional functionalities around monitoring the deployment for consistency etc. \n"
  },
  {
    "path": "build/Dockerfile",
    "content": "ARG binary_name=kfctl\nFROM registry.access.redhat.com/ubi8/ubi-minimal:latest AS build\n\nENV OPERATOR=/usr/local/bin/${binary_name} \\\n    USER_UID=1001 \\\n    USER_NAME=kfctl \\\n    HOMEDIR=/homedir\n\n# install operator binary\nCOPY _output/bin/${binary_name} ${OPERATOR}\n\nCOPY bin /usr/local/bin\nRUN  /usr/local/bin/user_setup\nRUN  /usr/local/bin/entrypoint\n\nFROM gcr.io/distroless/base-debian10\nENV OPERATOR=/usr/local/bin/${binary_name} \\\n    USER_UID=1001 \\\n    USER_NAME=kfctl \\\n    HOMEDIR=/homedir\n\nCOPY --from=build /usr/local/bin/${binary_name} ${OPERATOR}\nCOPY --from=build /etc/passwd /etc/passwd\nCOPY --from=build ${HOMEDIR} ${HOME}\n\nENTRYPOINT [\"${OPERATOR}\"]\n\nUSER ${USER_UID}\n"
  },
  {
    "path": "build/Dockerfile.ubi",
    "content": "ARG binary_name=kfctl\nFROM registry.access.redhat.com/ubi8/ubi-minimal:latest\nENV OPERATOR=/usr/local/bin/${binary_name}\\\n    HOME=/opt/${binary_name}\n\nRUN mkdir -p ${HOME} &&\\\n    chown 1001:0 ${HOME} &&\\\n    chmod ug+rwx ${HOME}\n\nWORKDIR ${HOME}\n\nCOPY _output/bin/${binary_name} ${OPERATOR}\n\nENTRYPOINT [\"${OPERATOR}\"]\n\nUSER 1001\n"
  },
  {
    "path": "cmd/kfctl/.gitignore",
    "content": "\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\nbin\n\n# Test binary, build with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Kubernetes Generated files - skip generated files, except for vendored files\n\n!vendor/**/zz_generated.*\n\n# editor and IDE paraphernalia\n.idea\n*.swp\n*.swo\n*~\n"
  },
  {
    "path": "cmd/kfctl/OWNERS",
    "content": "approvers:\n- jlewi\n- yanniszark\n"
  },
  {
    "path": "cmd/kfctl/README.md",
    "content": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*\n\n- [kfctl golang client](#kfctl-golang-client)\n  - [Overview](#overview)\n  - [Requirements](#requirements)\n  - [API and Packaging](#api-and-packaging)\n    - [KfApp Interface](#kfapp-interface)\n  - [Usage](#usage)\n  - [Subcommands](#subcommands)\n    - [**init**](#init)\n    - [**generate**](#generate)\n    - [**apply**](#apply)\n    - [**delete**](#delete)\n  - [Extending kfctl](#extending-kfctl)\n    - [Building the sample plugin](#building-the-sample-plugin)\n  - [Testing](#testing)\n    - [Testing kfctl (tests plugin functionality, `kfctl init`, `kfctl generate`)](#testing-kfctl-tests-plugin-functionality-kfctl-init-kfctl-generate)\n    - [Testing `kfctl init` for all platforms](#testing-kfctl-init-for-all-platforms)\n    - [Testing `kfctl generate` for all platforms](#testing-kfctl-generate-for-all-platforms)\n  - [gcp-click-to-deploy (no changes)](#gcp-click-to-deploy-no-changes)\n  - [golang modules and versioned packages](#golang-modules-and-versioned-packages)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n# kfctl golang client\n\n## Overview\n\nThe new `kfctl` client replaces `kfctl.sh` and is implemented in golang.\n\n**Note**: This README.md will be updated on an ongoing basis to reflect features, bug fixes.\n\n## Requirements\n\n - Create a common API for the UI (gcp-click-to-deploy) and `kfctl` (`KfApp`).\n\n - Separate different platform implementations of the [KfApp Interface](#kfapp-interface).\n\n - Separate different package manager implementations of the [KfApp Interface](#kfapp-interface).\n\n - Allow new platforms to be added to kfctl without rebuilding or reshipping kfctl (see [Extending kfctl](#extending-kfctl) below).\n\n - Do not change existing `REST` entrypoints or the `KsService` interface in `ksServer.go` at this time.\n\n - Package `KfApp` interface and related types for ease of use by kfctl and (later) gcp-click-to-deploy.\n\n## API and Packaging\n\n### KfApp Interface\n\nThe `KfApp` golang Interface is defined below:\n\n```golang\ntype ResourceEnum string\n\nconst (\n\tALL      ResourceEnum = \"all\"\n\tK8S      ResourceEnum = \"k8s\"\n\tPLATFORM ResourceEnum = \"platform\"\n)\n\n//\n// KfApp is used by commands under bootstrap/cmd/{bootstrap,kfctl}. KfApp provides a common\n// API for different platforms implementations like gcp and minikube.\n// KfApp is also implemented by different package managers (ksonnet, kustomize).\n//\ntype KfApp interface {\n\tApply(resources ResourceEnum, options map[string]interface{}) error\n\tDelete(resources ResourceEnum, options map[string]interface{}) error\n\tGenerate(resources ResourceEnum, options map[string]interface{}) error\n\tInit(options map[string]interface{}) error\n}\n```\n\nkfctl will statically include platforms that implement the KfApp interface.\nThese include:\n\n- platform: **minikube**\n  - bootstrap/v3/pkg/client/minikube/minikube.go\n- platform: **gcp**\n  - bootstrap/v3/pkg/client/gcp/gcp.go\n\nkfctl also statically links package managers that are used by the platforms.\nThis includes:\n\n- package manager: **kustomize**\n  - bootstrap/v3/pkg/client/kustomize/kustomize.go\n\nkfctl can dynamically load platforms and package managers that are not statically linked, as\ndescribed below in [Extending kfctl](#extending-kfctl).\n\n## Usage\n\n```\nA client CLI to create kubeflow applications for specific platforms or 'on-prem'\nto an existing k8s cluster.\n\nUsage:\n  kfctl [command]\n\nAvailable Commands:\n  apply       Deploy a generated kubeflow application.\n  completion  Generate shell completions\n  delete      Delete a kubeflow application.\n  generate    Generate a kubeflow application where resources is one of 'platform|k8s|all'.\n  help        Help about any command\n  init        Create a kubeflow application under <[path/]name>\n  show        Show a generated kubeflow application.\n  version     Print the version of kfctl.\n\nFlags:\n  -h, --help   help for kfctl\n\nUse \"kfctl [command] --help\" for more information about a command.\n```\n\nTypical use-case, non-platform specific.\n\n```sh\nkfctl init ~/myapp && \\\ncd ~/myapp && \\\nkfctl generate all && \\\nkfctl apply all\n```\n\n## Subcommands\n\n### **init**\n\n(kubeflow/bootstrap/cmd/kfctl/cmd/init.go)\n\n```\nCreate a kubeflow application under <[path/]name>. The <[path/]name> argument can either be a full path\nor a <name>. If just <name>, a directory <name> will be created in the current directory.\n\nUsage:\n  kfctl init <[path/]name> [flags]\n\nFlags:\n      --config string            Static config file to use. Can be either a local path or a URL.\n                                 For example:\n                                 --config=https://raw.githubusercontent.com/kubeflow/kubeflow/master/bootstrap/config/kfctl_platform_existing.yaml\n                                 --config=kfctl_platform_gcp.yaml\n      --disable_usage_report     disable_usage_report disable anonymous usage reporting.\n  -h, --help                     help for init\n  -n, --namespace string         namespace where kubeflow will be deployed (default \"kubeflow\")\n      --package-manager string   'kustomize[@version]' (default \"kustomize\")\n  -p, --platform string          one of 'aws|gcp|minikube'\n      --project string           name of the gcp project if --platform gcp\n  -r, --repo string              local github kubeflow repo\n      --skip-init-gcp-project    Set if you want to skip project initialization. Only meaningful if --platform gcp. Default to false\n      --use_basic_auth           use_basic_auth use basic auth service instead of IAP.\n      --use_istio                use_istio use istio for auth and traffic routing. (default true)\n  -V, --verbose                  verbose output default is false\n  -v, --version string           desired version of Kubeflow or master if not specified. Version can be master (eg --version master) or a git tag (eg --version=v0.5.0), or a PR (eg --version pull/<id>). (default \"master\")\n```\n\n### **generate**\n\n(kubeflow/bootstrap/cmd/kfctl/cmd/generate.go)\n```\nGenerate a kubeflow application where resources is one of 'platform|k8s|all'.\n\n  platform: non kubernetes resources (eg --platform gcp)\n  k8s: kubernetes resources\n  all: both platform and k8s\n\nThe default is 'all' for any selected platform.\n\nUsage:\n  kfctl generate [all(=default)|k8s|platform] [flags]\n\nFlags:\n      --email string      email if '--platform gcp'\n  -h, --help              help for generate\n      --hostname string   hostname if '--platform gcp'\n      --ipName string     ipName if '--platform gcp'\n      --mount-local       mount-local if '--platform minikube'\n  -V, --verbose           verbose output default is false\n      --zone string       zone if '--platform gcp' (default \"us-east1-d\")\n```\n\n### **apply**\n\n(kubeflow/bootstrap/cmd/kfctl/cmd/apply.go)\n\n```\nDeploy a generated kubeflow application.\n\nUsage:\n  kfctl apply [all(=default)|k8s|platform] [flags]\n\nFlags:\n  -h, --help      help for apply\n  -V, --verbose   verbose output default is false\n$ ☞\n$ ☞\n$ ☞\n$ ☞\n$ ☞  kfctl help apply\nDeploy a generated kubeflow application.\n\nUsage:\n  kfctl apply [all(=default)|k8s|platform] [flags]\n\nFlags:\n  -h, --help      help for apply\n  -V, --verbose   verbose output default is false\n```\n\n### **delete**\n\n(kubeflow/bootstrap/cmd/kfctl/cmd/delete.go)\n\n```\nDelete a kubeflow application.\n\nUsage:\n  kfctl delete [all(=default)|k8s|platform] [flags]\n\nFlags:\n  -h, --help      help for delete\n  -V, --verbose   verbose output default is false\n```\n\n### **set-image-name**\n\n(kubeflow/bootstrap/cmd/kfctl/cmd/set-image-name.go)\n\n```text\nSets custom image names for kubeflow components.\n\nReplaces the image name in kubeflow manifests with the specified prefix, to support custom image registries.\nIt assumes that all components specify images in kustomization.yaml, base or overlay. Expected prefix format is\n<registry>[:port][/component]*\n\nThe filter flag sets the custom image name only for images with matching prefix.\nThe flatten flag discards both registry and name components except for the last one, to support registries with a flat hierarchical path.\n\nUsage:\n  kfctl set-image-name <prefix> [flags]\n\nFlags:\n  -f, --filter string   Only set name for images with matching prefix\n      --flatten         Set to true for registries not supporting hierarchical paths with more than two components\n  -h, --help            help for set-image-name\n  -V, --verbose         Enable verbose output\n```\n\n---\n\n## Extending kfctl\n\n`kfctl` can be extended to work with new platforms or package managers without requiring recompilation.\nAn example is under bootstrap/cmd/plugins/dockerfordesktop/dockerfordesktop.go. A particular platform\nprovides a shared library (.so) under the env var `PLUGINS_ENVIRONMENT`\nthat kfctl would load and execute. The shared library needs to define\n\n```\nfunc GetKfApp(options map[string]interface{}) kftypes.KfApp\n```\n\nwhere the return type implements the [KfApp Interface](#kfapp-interface).\n\nIn this sample, running\n\n```\nkfctl init ~/dockerfordesktop --platform docker-for-desktop\n```\n\nwill result in kfctl loading $PLUGINS_ENVIRONMENT/dockerfordesktop.so and calling its methods that\nimplement the KfApp Interface.\n\n### Building the sample plugin\n\n```\nmake build-dockerfordesktop-plugin\n```\n\n## Testing\n\n### Testing kfctl (tests plugin functionality, `kfctl init`, `kfctl generate`)\n\n```\nmake test-kfctl\n```\n\n### Testing `kfctl init` for all platforms\n\n```\nmake test-init\n```\n\n### Testing `kfctl generate` for all platforms\n\n```\nmake test-generate\n```\n\n## gcp-click-to-deploy (no changes)\n\nReferences to Ksonnet types have been removed\n\n## golang modules and versioned packages\n\nkustomize leverages golang modules by declaring a 'v3' version in go.mod\n\n"
  },
  {
    "path": "cmd/kfctl/cmd/alpha.go",
    "content": "package cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n)\n\nvar alphaCfg = viper.New()\n\n// alphaCmd represents the commands that are in alpha\nvar alphaCmd = &cobra.Command{\n\tUse:   \"alpha\",\n\tShort: \"Alpha kfctl features.\",\n\tLong:  `Alpha kfctl features.`,\n}\n\nfunc init() {\n\trootCmd.AddCommand(alphaCmd)\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/apply.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\tep \"github.com/jlewi/cloud-endpoints-controller/pkg\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/coordinator\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfupgrade\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n)\n\nvar applyCfg = viper.New()\nvar kfApp kftypes.KfApp\nvar err error\n\nvar kubeContext = \"\"\n\n// KFDef example configs to be printed out from apply --help\nconst (\n\tawsConfig      = \"https://raw.githubusercontent.com/kubeflow/manifests/v1.2-branch/kfdef/kfctl_aws.v1.2.0.yaml\"\n\tgcpConfig      = \"https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_gcp_iap.v1.0.0.yaml\"\n\tistioDexConfig = \"https://raw.githubusercontent.com/kubeflow/manifests/v1.2-branch/kfdef/kfctl_istio_dex.v1.2.0.yaml\"\n\tk8sConfig      = \"https://raw.githubusercontent.com/kubeflow/manifests/v1.2-branch/kfdef/kfctl_k8s_istio.v1.2.0.yaml\"\n)\n\n// applyCmd represents the apply command\nvar applyCmd = &cobra.Command{\n\tUse:   \"apply -f ${CONFIG}\",\n\tShort: \"deploys a kubeflow application.\",\n\tLong: `'kfctl apply' builds and deploys a kubeflow application from a KFDef config.` + \"\\n\" +\n\t\t`To install run -> ` + ColorPrint(\"kfctl apply -f ${CONFIG}\") + \"\\n\" +\n\t\t`For more information, run 'kfctl apply -h' or read the docs at www.kubeflow.org.`,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tlog.SetLevel(log.InfoLevel)\n\t\tif applyCfg.GetBool(string(kftypes.VERBOSE)) != true {\n\t\t\tlog.SetLevel(log.WarnLevel)\n\t\t}\n\n\t\t// Load config from exisiting app.yaml\n\t\tif configFilePath == \"\" {\n\t\t\treturn fmt.Errorf(\"Must pass in -f configFile\")\n\t\t}\n\n\t\tkind, err := utils.GetObjectKindFromUri(configFilePath)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Cannot determine the object kind: %v\", err)\n\t\t}\n\t\tswitch kind {\n\t\tcase string(kftypes.KFDEF):\n\t\t\tkfApp, err = coordinator.NewLoadKfAppFromURI(configFilePath)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to build kfApp from URI %s: %v\", configFilePath, err)\n\t\t\t}\n\t\t\tif err := kfApp.Apply(kftypes.ALL); err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to apply: %s\", err)\n\t\t\t}\n\t\t\tlog.Info(\"Applied the configuration Successfully!\")\n\t\t\treturn nil\n\t\tcase string(kftypes.KFUPGRADE):\n\t\t\tlog.Warnf(\"Support for kind %s is deprecated and will be removed in subsequent versions\", kftypes.KFUPGRADE)\n\t\t\tkfUpgrade, err := kfupgrade.NewKfUpgrade(configFilePath)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"couldn't load KfUpgrade: %v\", err)\n\t\t\t}\n\n\t\t\terr = kfUpgrade.Apply()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"couldn't apply KfUpgrade: %v\", err)\n\t\t\t}\n\t\t\treturn nil\n\t\tcase ep.Kind:\n\t\t\treturn ep.Process(configFilePath, kubeContext)\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"Unsupported object kind: %v\", kind)\n\t\t}\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(applyCmd)\n\n\tapplyCfg.SetConfigName(\"app\")\n\tapplyCfg.SetConfigType(\"yaml\")\n\n\t// Config file option\n\tapplyCmd.PersistentFlags().StringVarP(&configFilePath, string(kftypes.FILE), \"f\", \"\",\n\t\t`Static config file to use. Can be either a local path:\n\t\texport CONFIG=./kfctl_gcp_iap.yaml\n\tor a URL:\n\t\texport CONFIG=`+gcpConfig+`\n\t\texport CONFIG=`+istioDexConfig+`\n\t\texport CONFIG=`+awsConfig+`\n\t\texport CONFIG=`+k8sConfig+`\n\tkfctl apply -V --file=${CONFIG}`)\n\n\t// verbose output\n\tapplyCmd.Flags().BoolP(string(kftypes.VERBOSE), \"V\", false,\n\t\tstring(kftypes.VERBOSE)+\" output default is false\")\n\n\tapplyCmd.Flags().StringVar(&kubeContext, \"context\", \"\", \"Optional kubernetes context to use when applying resources. Currently not used by KFDef resources.\")\n\tbindErr := applyCfg.BindPFlag(string(kftypes.VERBOSE), applyCmd.Flags().Lookup(string(kftypes.VERBOSE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/build.go",
    "content": "// Copyright © 2019 NAME HERE <EMAIL ADDRESS>\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/coordinator\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfupgrade\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n)\n\nvar configFilePath string\nvar buildCfg = viper.New()\n\n// buildCmd represents the build command\nvar buildCmd = &cobra.Command{\n\tUse:   \"build\",\n\tShort: \"Builds a KF App from a config file\",\n\tLong:  `Builds a KF App from a config file`,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tlog.SetLevel(log.InfoLevel)\n\t\tif buildCfg.GetBool(string(kftypes.VERBOSE)) != true {\n\t\t\tlog.SetLevel(log.WarnLevel)\n\t\t}\n\n\t\tkind, err := utils.GetObjectKindFromUri(configFilePath)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Cannot determine the object kind: %v\", err)\n\t\t}\n\n\t\tvar kfApp kftypes.KfApp\n\t\tswitch kind {\n\t\tcase string(kftypes.KFDEF):\n\t\t\tkfApp, err = coordinator.NewLoadKfAppFromURI(configFilePath)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to build kfApp from URI %s: %v\", configFilePath, err)\n\t\t\t}\n\t\tcase string(kftypes.KFUPGRADE):\n\t\t\tlog.Warnf(\"Support for kind %s is deprecated and will be removed in subsequent versions\", kftypes.KFUPGRADE)\n\t\t\tkfApp, err := kfupgrade.NewKfUpgrade(configFilePath)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"couldn't load KfUpgrade: %v\", err)\n\t\t\t}\n\n\t\t\tif err := kfApp.Generate(); err != nil {\n\t\t\t\treturn fmt.Errorf(\"couldn't generate KfApp: %v\", err)\n\t\t\t}\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"Unsupported object kind: %v\", kind)\n\t\t}\n\n\t\tif buildCfg.GetBool(string(kftypes.DUMP)) == true {\n\t\t\tkfApp.Dump(kftypes.ALL)\n\t\t}\n\t\treturn nil\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(buildCmd)\n\n\tbuildCfg.SetConfigName(\"app\")\n\tbuildCfg.SetConfigType(\"yaml\")\n\n\t// Config file option\n\tbuildCmd.PersistentFlags().StringVarP(&configFilePath, string(kftypes.FILE), \"f\", \"\",\n\t\t`Static config file to use. Can be either a local path:\n\t\texport CONFIG=./kfctl_gcp_iap.yaml\n\tor a URL:\n\t\texport CONFIG=`+gcpConfig+`\n\t\texport CONFIG=`+istioDexConfig+`\n\t\texport CONFIG=`+awsConfig+`\n\t\texport CONFIG=`+k8sConfig+`\n\tkfctl build -V --file=${CONFIG}`)\n\n\t// verbose output\n\tbuildCmd.Flags().BoolP(string(kftypes.VERBOSE), \"V\", false,\n\t\tstring(kftypes.VERBOSE)+\" output default is false\")\n\tbindErr := buildCfg.BindPFlag(string(kftypes.VERBOSE), buildCmd.Flags().Lookup(string(kftypes.VERBOSE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n\n\t// dump flag\n\tbuildCmd.Flags().BoolP(string(kftypes.DUMP), \"d\", false,\n\t\tstring(kftypes.DUMP)+\" manifests to stdout, default is false\")\n\tbindErr = buildCfg.BindPFlag(string(kftypes.DUMP), buildCmd.Flags().Lookup(string(kftypes.DUMP)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/completion.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n\t\"os\"\n)\n\nvar completionCmd = &cobra.Command{\n\tUse:       \"completion [shell]\",\n\tArgs:      cobra.OnlyValidArgs,\n\tValidArgs: []string{\"bash\", \"zsh\"},\n\tShort:     \"Generate shell completions\",\n\tLong: `To load completion run\n\n. <(kfctl completion)\n\nTo configure your bash shell to load completions for each session add to your bashrc\n\n# ~/.bashrc or ~/.profile\n. <(kfctl completion)\n\nIf you want to use zsh instead, do the following:\n\n$ kfctl completion zsh > _kfctl\nThen move _kfctl into $fpath and run compinit.\n`,\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tshell := \"bash\"\n\t\tif len(args) > 0 {\n\t\t\tshell = args[0]\n\t\t}\n\n\t\tswitch shell {\n\t\tcase \"zsh\":\n\t\t\trootCmd.GenZshCompletion(os.Stdout)\n\t\tdefault:\n\t\t\trootCmd.GenBashCompletion(os.Stdout)\n\t\t}\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(completionCmd)\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/delete.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/coordinator\"\n\tkfloaders \"github.com/kubeflow/kfctl/v3/pkg/kfconfig/loaders\"\n\tkfutils \"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n)\n\nvar deleteCfg = viper.New()\n\n// deleteCmd represents the delete command\nvar deleteCmd = &cobra.Command{\n\tArgs:  cobra.NoArgs,\n\tUse:   \"delete\",\n\tShort: \"Delete a kubeflow application.\",\n\tLong:  `Delete a kubeflow application.`,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tlog.SetLevel(log.InfoLevel)\n\t\tif deleteCfg.GetBool(string(kftypes.VERBOSE)) != true {\n\t\t\tlog.SetLevel(log.WarnLevel)\n\t\t}\n\t\t// Load config from exisiting app.yaml\n\t\tif configFilePath == \"\" {\n\t\t\treturn fmt.Errorf(\"Must pass in -f configFile\")\n\t\t}\n\n\t\t// Writes annotations to pass information to kfapps.\n\t\tforceDeleteAnn := strings.Join([]string{kfutils.KfDefAnnotation, kfutils.ForceDelete}, \"/\")\n\t\tannValue := \"false\"\n\t\tif deleteCfg.GetBool(string(kftypes.FORCE_DELETION)) == true {\n\t\t\tannValue = \"true\"\n\t\t}\n\t\tsetAnnotations(configFilePath, map[string]string{\n\t\t\tforceDeleteAnn: annValue,\n\t\t})\n\n\t\tkfApp, err = coordinator.NewLoadKfAppFromURI(configFilePath)\n\t\tif err != nil || kfApp == nil {\n\t\t\treturn fmt.Errorf(\"error loading kfapp: %v\", err)\n\t\t}\n\n\t\tdeleteErr := kfApp.Delete(kftypes.ALL)\n\t\tif deleteErr != nil {\n\t\t\treturn fmt.Errorf(\"couldn't delete KfApp: %v\", deleteErr)\n\t\t}\n\t\treturn nil\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(deleteCmd)\n\n\tdeleteCfg.SetConfigName(\"app\")\n\tdeleteCfg.SetConfigType(\"yaml\")\n\n\tdeleteCmd.PersistentFlags().StringVarP(&configFilePath, string(kftypes.FILE), \"f\", \"\",\n\t\t\"The local config file of KfDef.\")\n\n\t// verbose output\n\tdeleteCmd.Flags().BoolP(string(kftypes.VERBOSE), \"V\", false,\n\t\tstring(kftypes.VERBOSE)+\" output default is false\")\n\tbindErr := deleteCfg.BindPFlag(string(kftypes.VERBOSE), deleteCmd.Flags().Lookup(string(kftypes.VERBOSE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n\n\t// force deletion, runs best-effort deletion and skips non-fatal checks.\n\tdeleteCmd.Flags().Bool(string(kftypes.FORCE_DELETION), false,\n\t\tstring(kftypes.FORCE_DELETION)+\" output default is false\")\n\tbindErr = deleteCfg.BindPFlag(string(kftypes.FORCE_DELETION), deleteCmd.Flags().Lookup(string(kftypes.FORCE_DELETION)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.FORCE_DELETION), bindErr)\n\t\treturn\n\t}\n\n\tdeleteCmd.Flags().Bool(string(kftypes.DELETE_STORAGE), false,\n\t\t\"Set if you want to delete app's storage cluster used for mlpipeline.\")\n\tbindErr = deleteCfg.BindPFlag(string(kftypes.DELETE_STORAGE), deleteCmd.Flags().Lookup(string(kftypes.DELETE_STORAGE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.DELETE_STORAGE), bindErr)\n\t\treturn\n\t}\n}\n\nfunc setAnnotations(configPath string, annotations map[string]string) error {\n\tconfig, err := kfloaders.LoadConfigFromURI(configPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tanns := config.GetAnnotations()\n\tif anns == nil {\n\t\tanns = map[string]string{}\n\t}\n\tfor ann, val := range annotations {\n\t\tanns[ann] = val\n\t}\n\tconfig.SetAnnotations(anns)\n\treturn kfloaders.WriteConfigToFile(*config)\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/generate.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/spf13/cobra\"\n)\n\nvar generateDeprecationMessage = ColorPrint(\"'kfctl generate' has been replaced by 'kfctl build'\") + \"\\n\" +\n\t`Please switch to new semantics.\nTo build a KFAPP run -> ` + ColorPrint(\"kfctl build -f ${CONFIG}\") + \"\\n\" +\n\t`Then to install -> ` + ColorPrint(\"kfctl apply\") + \"\\n\" +\n\t`For more information, run 'kfctl build -h' or read the docs at www.kubeflow.org.`\n\n// generateCmd represents the generate command\nvar generateCmd = &cobra.Command{\n\tUse:   \"generate\",\n\tShort: generateDeprecationMessage,\n\tLong:  generateDeprecationMessage,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\treturn fmt.Errorf(generateDeprecationMessage)\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(generateCmd)\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/init.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/spf13/cobra\"\n)\n\n// ColorPrint Sprintf with yellow color\nvar ColorPrint = color.New(color.FgYellow).SprintFunc()\nvar initDeprecationMessage = ColorPrint(\"'kfctl init' has been removed.\") + \"\\n\" +\n\t`Please switch to new semantics.\nTo install run -> ` + ColorPrint(\"kfctl apply -f ${CONFIG}\") + \"\\n\" +\n\t`For more information, run 'kfctl apply -h' or read the docs at www.kubeflow.org.`\n\n// initCmd represents the init command\nvar initCmd = &cobra.Command{\n\tUse:   \"init\",\n\tShort: initDeprecationMessage,\n\tLong:  initDeprecationMessage,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\treturn fmt.Errorf(initDeprecationMessage)\n\t},\n}\n\nfunc init() {\n\trootCmd.AddCommand(initCmd)\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/mirror.go",
    "content": "package cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n)\n\n// alphaCmd represents the commands that are in alpha\nvar mirrorCmd = &cobra.Command{\n\tUse:   \"mirror\",\n\tShort: \"kfctl alpha mirror\",\n\tLong:  `kfctl alpha mirror: `,\n}\n\nfunc init() {\n\talphaCmd.AddCommand(mirrorCmd)\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/mirror_build.go",
    "content": "package cmd\n\nimport (\n\t\"fmt\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tmirrortypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/imagemirror/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/mirror\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"sigs.k8s.io/yaml\"\n)\n\nvar outputFileName string\nvar directory string\nvar gcb bool\n\nfunc init() {\n\treplicateBuildCmd.Flags().StringVarP(&outputFileName, \"output\", \"o\", \"\",\n\t\t`Name of the output pipeline file\n\t\tkfctl alpha mirror build -o <name>`)\n\treplicateBuildCmd.Flags().StringVarP(&directory, \"directory\", \"d\", \"kustomize\",\n\t\t`The directory to search for kustomization files listing images to mirror\n\t\tkfctl alpha mirror build -d <directory>`)\n\treplicateBuildCmd.Flags().BoolVar(&gcb, \"gcb\", false, `Generate cloud build config`)\n\t// verbose output\n\treplicateBuildCmd.Flags().BoolP(string(kftypes.VERBOSE), \"V\", false,\n\t\tstring(kftypes.VERBOSE)+\" output default is false\")\n\tbindErr := replicateBuildCfg.BindPFlag(string(kftypes.VERBOSE), replicateBuildCmd.Flags().Lookup(string(kftypes.VERBOSE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n\n\tmirrorCmd.AddCommand(replicateBuildCmd)\n}\n\nvar replicateBuildCfg = viper.New()\nvar replicateBuildCmd = &cobra.Command{\n\tUse:   \"build <local_config_file_path> -o <pipeline_file>\",\n\tShort: \"Generate tekton pipeline file which will replicate images to target registry.\",\n\tLong: `Generate tekton pipeline file which replicate images to target registry.\n\nImage replication rules are defined in config file.\n\n`,\n\tArgs: cobra.ExactArgs(1),\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tlog.SetLevel(log.WarnLevel)\n\t\tif replicateBuildCfg.GetBool(string(kftypes.VERBOSE)) {\n\t\t\tlog.SetLevel(log.InfoLevel)\n\t\t}\n\t\tconfigFile := args[0]\n\t\tisRemoteFile, err := utils.IsRemoteFile(configFile)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif isRemoteFile {\n\t\t\treturn fmt.Errorf(\"config file path should be non-empty local file.\")\n\t\t}\n\n\t\tif outputFileName == \"\" {\n\t\t\treturn fmt.Errorf(\"You must specify an output file with -o\")\n\t\t}\n\t\tif _, err := os.Stat(configFile); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tconfBytes, err := ioutil.ReadFile(configFile)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\treplication := mirrortypes.Replication{}\n\t\tif err := yaml.Unmarshal(confBytes, &replication); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, pattern := range replication.Spec.Patterns {\n\t\t\tlog.Infof(\"Context: %v; destination registry: %v\", replication.Spec.Context, pattern.Dest)\n\t\t\tif replication.Spec.Context == \"\" || pattern.Dest == \"\" {\n\t\t\t\treturn fmt.Errorf(\"Config: context and dest registry cannot be empty\")\n\t\t\t}\n\n\t\t}\n\n\t\treturn mirror.GenerateMirroringPipeline(directory, replication.Spec, outputFileName, gcb)\n\t},\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/mirror_overwrite.go",
    "content": "package cmd\n\nimport (\n\t\"fmt\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/mirror\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n)\n\nvar inputFileName string\n\nfunc init() {\n\treplicateOverwriteCmd.Flags().StringVarP(&inputFileName, \"input\", \"i\", \"\",\n\t\t`Name of the input pipeline file\n\t\tkfctl alpha  mirror overwrite -o <name>`)\n\t// verbose output\n\treplicateOverwriteCmd.Flags().BoolP(string(kftypes.VERBOSE), \"V\", false,\n\t\tstring(kftypes.VERBOSE)+\" output default is false\")\n\tbindErr := replicateOverwriteCfg.BindPFlag(string(kftypes.VERBOSE), replicateOverwriteCmd.Flags().Lookup(string(kftypes.VERBOSE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n\n\tmirrorCmd.AddCommand(replicateOverwriteCmd)\n}\n\nvar replicateOverwriteCfg = viper.New()\nvar replicateOverwriteCmd = &cobra.Command{\n\tUse:   \"overwrite <registry>\",\n\tShort: \"\",\n\tLong: `Read input tekton pipeline file with images replication info,\nupdate images in kustomization.yaml: image:tag -> newImage:tag\n`,\n\tArgs: cobra.ExactArgs(0),\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tlog.SetLevel(log.WarnLevel)\n\t\tif replicateOverwriteCfg.GetBool(string(kftypes.VERBOSE)) {\n\t\t\tlog.SetLevel(log.InfoLevel)\n\t\t}\n\t\tif inputFileName == \"\" {\n\t\t\treturn fmt.Errorf(\"Please specify input tekton pipeline file by -i\")\n\t\t}\n\t\treturn mirror.UpdateKustomize(inputFileName)\n\t},\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/root.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/spf13/cobra\"\n\t\"os\"\n)\n\nfunc processResourceArg(args []string) (kftypes.ResourceEnum, error) {\n\tif len(args) > 1 {\n\t\treturn kftypes.ALL, fmt.Errorf(\"unknown extra args %v\", args[1:])\n\t}\n\tresources := kftypes.ALL\n\tif len(args) == 1 {\n\t\tswitch kftypes.ResourceEnum(args[0]) {\n\t\tcase kftypes.ALL:\n\t\tcase kftypes.K8S:\n\t\t\tresources = kftypes.K8S\n\t\tcase kftypes.PLATFORM:\n\t\t\tresources = kftypes.PLATFORM\n\t\tdefault:\n\t\t\treturn kftypes.ALL, fmt.Errorf(\"unknown argument %v\", args[0])\n\t\t}\n\t}\n\treturn resources, nil\n}\n\n// rootCmd represents the base command when called without any subcommands\nvar rootCmd = &cobra.Command{\n\tUse:   \"kfctl\",\n\tShort: \"A client CLI to create kubeflow applications\",\n\tLong: `A client CLI to create kubeflow applications for specific platforms or 'on-prem' \nto an existing k8s cluster.`,\n}\n\nvar (\n\t// VERSION is set during build\n\tVERSION string\n)\n\n// Execute adds all child commands to the root command and sets flags appropriately.\n// This is called by main.main(). It only needs to happen once to the rootCmd.\nfunc Execute(version string) {\n\tVERSION = version\n\n\tif err := rootCmd.Execute(); err != nil {\n\t\tfmt.Printf(\"kfctl exited with error: %+v\", err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc init() {\n\tcobra.OnInitialize(initConfig)\n}\n\n// initConfig creates a Viper config file and set's it's name and type\nfunc initConfig() {\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/set-image-name.go",
    "content": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/image\"\n\t\"strings\"\n\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/kustomize\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n\t\"gopkg.in/yaml.v2\"\n)\n\nvar filter string\nvar flatten bool\n\nfunc init() {\n\tsetImageNameCmd.Flags().StringVarP(&filter, \"filter\", \"f\", \"\", \"Only set name for images with matching prefix\")\n\tsetImageNameCmd.Flags().BoolVar(&flatten, \"flatten\", false, \"Set to true for registries not supporting hierarchical paths with more than two components\")\n\tsetImageNameCfg.SetConfigName(\"app\")\n\tsetImageNameCfg.SetConfigType(\"yaml\")\n\n\t// verbose output\n\tsetImageNameCmd.Flags().BoolP(string(kftypes.VERBOSE), \"V\", false,\n\t\tstring(kftypes.VERBOSE)+\" output default is false\")\n\tbindErr := setImageNameCfg.BindPFlag(string(kftypes.VERBOSE), setImageNameCmd.Flags().Lookup(string(kftypes.VERBOSE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n\n\talphaCmd.AddCommand(setImageNameCmd)\n}\n\nvar setImageNameCfg = viper.New()\nvar setImageNameCmd = &cobra.Command{\n\tUse:   \"set-image-name <prefix>\",\n\tShort: \"Custom image names for kubeflow components\",\n\tLong: `Sets custom image names for kubeflow components.\n\nReplaces the image name in kubeflow manifests with the specified prefix, to support custom image registries.\nChanges are printed to stdout in the form of <old>=<new>, which can then be used to mirror the images.\n\nIt assumes that all components specify images in kustomization.yaml, base or overlay. Expected prefix format is\n<registry>[:port][/component]*\n\nThe filter flag sets the custom image name only for images with matching prefix.\nThe flatten flag discards both registry and name components except for the last one, to support registries with a flat hierarchical path.\n`,\n\tArgs: cobra.ExactArgs(1),\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tlog.SetLevel(log.WarnLevel)\n\t\tif setImageNameCfg.GetBool(string(kftypes.VERBOSE)) {\n\t\t\tlog.SetLevel(log.InfoLevel)\n\t\t}\n\t\tlog.Debugf(\"Using prefix %s (filter %s, flatten %t)\\n\", args[0], filter, flatten)\n\n\t\tnewNameComponents, err := parsePrefix(args[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn filepath.Walk(\".\", func(path string, info os.FileInfo, err error) error {\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif info.IsDir() {\n\t\t\t\tlog.Debugf(\"Looking for kustomization.yaml in %q\\n\", path)\n\t\t\t\tabsPath, err := filepath.Abs(path)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tkustomizationFilePath := filepath.Join(absPath, \"kustomization.yaml\")\n\t\t\t\tif _, err := os.Stat(kustomizationFilePath); err == nil {\n\t\t\t\t\tkustomization := kustomize.GetKustomization(absPath)\n\t\t\t\t\tfor i, image := range kustomization.Images {\n\t\t\t\t\t\tif !strings.HasPrefix(image.Name, filter) {\n\t\t\t\t\t\t\tlog.Infof(\"No filter match for %s, skipping\\n\", image.Name)\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnewName := setImageName(image.Name, newNameComponents)\n\t\t\t\t\t\tlog.Infof(\"Replacing image name from %s to %s\", image.Name, newName)\n\t\t\t\t\t\tkustomization.Images[i].NewName = newName\n\t\t\t\t\t\tfmt.Printf(\"%s=%s\\n\", imageToString(image), imageToString(kustomization.Images[i]))\n\t\t\t\t\t}\n\n\t\t\t\t\tif err := os.Remove(kustomizationFilePath); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\n\t\t\t\t\tdata, err := yaml.Marshal(kustomization)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\n\t\t\t\t\tfile, err := os.OpenFile(kustomizationFilePath, os.O_WRONLY|os.O_CREATE, 0644)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tdefer file.Close()\n\n\t\t\t\t\tif _, err := file.Write(data); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\treturn nil\n\t\t})\n\t},\n}\n\nfunc parsePrefix(prefix string) (map[string]string, error) {\n\tprefixParser := regexp.MustCompile(`^(?P<host>(\\w[\\w-0-9]+\\.)+\\w+)(:(?P<port>\\d+))?(/(?P<components>([\\w-_/]*)))?$`)\n\tmatch := prefixParser.FindStringSubmatch(prefix)\n\tif len(match) == 0 {\n\t\treturn nil, fmt.Errorf(\"Unsupported prefix %s\", prefix)\n\t}\n\n\tresult := make(map[string]string)\n\n\tfor i, name := range prefixParser.SubexpNames() {\n\t\tif i != 0 && name != \"\" {\n\t\t\tresult[name] = match[i]\n\t\t}\n\t}\n\n\treturn result, nil\n}\n\nfunc parseImageName(name string) map[string]string {\n\timageParser := regexp.MustCompile(`^((?P<host>(\\w[\\w-0-9]+\\.)+\\w+)(:(?P<port>\\d+))?/)?((?P<components>([\\w-_]+/)*([\\w-_]+))/)?(?P<image>[\\w-_]*)(:(?P<tag>.*))?$`)\n\tmatch := imageParser.FindStringSubmatch(name)\n\n\tif len(match) == 0 {\n\t\treturn nil\n\t}\n\n\tresult := make(map[string]string)\n\n\tfor i, name := range imageParser.SubexpNames() {\n\t\tif i != 0 && name != \"\" {\n\t\t\tresult[name] = match[i]\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunc setImageName(oldName string, newNameComponents map[string]string) string {\n\toldNameComponents := parseImageName(oldName)\n\n\tdomainSlice := []string{newNameComponents[\"host\"]}\n\tif newNameComponents[\"port\"] != \"\" {\n\t\tdomainSlice = append(domainSlice, newNameComponents[\"port\"])\n\t}\n\tdomain := strings.Join(domainSlice, \":\")\n\n\timageSlice := []string{oldNameComponents[\"image\"]}\n\tif oldNameComponents[\"tag\"] != \"\" {\n\t\timageSlice = append(imageSlice, oldNameComponents[\"tag\"])\n\t}\n\timage := strings.Join(imageSlice, \":\")\n\n\tresultSlice := []string{domain, newNameComponents[\"components\"]}\n\n\tif !flatten {\n\t\tresultSlice = append(resultSlice, oldNameComponents[\"components\"])\n\t}\n\n\tresultSlice = append(resultSlice, image)\n\n\treturn path.Join(resultSlice...)\n}\n\nfunc imageToString(image image.Image) string {\n\tres := image.Name\n\tif image.NewName != \"\" {\n\t\tres = image.NewName\n\t}\n\tif image.Digest != \"\" {\n\t\tres = res + \"@\" + image.Digest\n\t} else if image.NewTag != \"\" {\n\t\tres = res + \":\" + image.NewTag\n\t} else {\n\t\tres = res + \":latest\"\n\t}\n\treturn res\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/set-image-name_test.go",
    "content": "package cmd\n\nimport (\n\t\"reflect\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/image\"\n\t\"testing\"\n)\n\nfunc Test_imageToString(t *testing.T) {\n\ttests := []struct {\n\t\tname  string\n\t\timage image.Image\n\t\twant  string\n\t}{\n\t\t{\n\t\t\tname: \"docker-newtag\",\n\t\t\timage: image.Image{\n\t\t\t\tName:   \"mysql\",\n\t\t\t\tNewTag: \"15.0\",\n\t\t\t},\n\t\t\twant: \"mysql:15.0\",\n\t\t},\n\t\t{\n\t\t\tname: \"docker-digest\",\n\t\t\timage: image.Image{\n\t\t\t\tName:   \"mysql\",\n\t\t\t\tDigest: \"sha256:5645412634544\",\n\t\t\t},\n\t\t\twant: \"mysql@sha256:5645412634544\",\n\t\t},\n\t\t{\n\t\t\tname: \"gcr-newname-tag\",\n\t\t\timage: image.Image{\n\t\t\t\tName:    \"gcr.io/kubeflow/katib\",\n\t\t\t\tNewName: \"gcr.io/myproject/katib\",\n\t\t\t\tNewTag:  \"15.0\",\n\t\t\t},\n\t\t\twant: \"gcr.io/myproject/katib:15.0\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tgot := imageToString(test.image)\n\t\t\tif got != test.want {\n\t\t\t\tt.Fatalf(\"Got: %s. Want %s.\", got, test.want)\n\t\t\t}\n\t\t})\n\n\t}\n}\n\nfunc Test_parseImageName(t *testing.T) {\n\ttests := []struct {\n\t\tname  string\n\t\tinput string\n\t\twant  map[string]string\n\t}{\n\t\t{name: \"invalid random\", input: \"random text\", want: nil},\n\t\t{name: \"invalid\", input: \"gcr.io\", want: nil},\n\t\t{name: \"image\", input: \"mysql\", want: map[string]string{\"components\": \"\", \"host\": \"\", \"port\": \"\", \"image\": \"mysql\", \"tag\": \"\"}},\n\t\t{name: \"image:tag\", input: \"mysql:latest\", want: map[string]string{\"components\": \"\", \"host\": \"\", \"port\": \"\", \"image\": \"mysql\", \"tag\": \"latest\"}},\n\t\t{name: \"repository/image:tag\", input: \"argoproj/argoui:v2.3.0\", want: map[string]string{\"components\": \"argoproj\", \"host\": \"\", \"port\": \"\", \"image\": \"argoui\", \"tag\": \"v2.3.0\"}},\n\t\t{\n\t\t\tname:  \"registry/repository/image:tag\",\n\t\t\tinput: \"gcr.io/kubeflow-images-public/admission-webhook:v20190520-v0-139-gcee39dbc-dirty-0d8f4c\",\n\t\t\twant: map[string]string{\n\t\t\t\t\"components\": \"kubeflow-images-public\", \"host\": \"gcr.io\", \"port\": \"\", \"image\": \"admission-webhook\", \"tag\": \"v20190520-v0-139-gcee39dbc-dirty-0d8f4c\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"registry/nested/repository/image\",\n\t\t\tinput: \"gcr.io/kubeflow-images-public/kubernetes-sigs/application\",\n\t\t\twant: map[string]string{\n\t\t\t\t\"components\": \"kubeflow-images-public/kubernetes-sigs\", \"host\": \"gcr.io\", \"port\": \"\", \"image\": \"application\", \"tag\": \"\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"registry/nested/repository/image:tag\",\n\t\t\tinput: \"gcr.io/stackdriver-prometheus/stackdriver-prometheus:release-0.4.2\",\n\t\t\twant: map[string]string{\n\t\t\t\t\"components\": \"stackdriver-prometheus\", \"host\": \"gcr.io\", \"port\": \"\", \"image\": \"stackdriver-prometheus\", \"tag\": \"release-0.4.2\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:  \"registry:port/nested/repository/image:tag\",\n\t\t\tinput: \"gcr.io:443/test/kubeflow-images-public/admission-webhook:v20190520-v0-139-gcee39dbc-dirty-0d8f4c\",\n\t\t\twant: map[string]string{\n\t\t\t\t\"components\": \"test/kubeflow-images-public\", \"host\": \"gcr.io\", \"port\": \"443\", \"image\": \"admission-webhook\", \"tag\": \"v20190520-v0-139-gcee39dbc-dirty-0d8f4c\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := parseImageName(tt.input); !reflect.DeepEqual(got, tt.want) {\n\t\t\t\tt.Errorf(\"parseImageName() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_parsePrefix(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\tprefix  string\n\t\twant    map[string]string\n\t\twantErr bool\n\t}{\n\t\t{name: \"host\", prefix: \"test.io\", wantErr: false, want: map[string]string{\"host\": \"test.io\", \"port\": \"\", \"components\": \"\"}},\n\t\t{name: \"host with port\", prefix: \"test.io:7999\", wantErr: false, want: map[string]string{\"host\": \"test.io\", \"port\": \"7999\", \"components\": \"\"}},\n\t\t{name: \"host and simple hierarchical path\", prefix: \"test.io/my-repository\", wantErr: false, want: map[string]string{\"host\": \"test.io\", \"port\": \"\", \"components\": \"my-repository\"}},\n\t\t{name: \"host and complex hierarchical path\", prefix: \"test.io/my-repository/my-subcatecory\", wantErr: false, want: map[string]string{\"host\": \"test.io\", \"port\": \"\", \"components\": \"my-repository/my-subcatecory\"}},\n\t\t{name: \"fully qualified image name\", prefix: \"test.io/my-repository/image:tag\", wantErr: true, want: nil},\n\t\t{name: \"random\", prefix: \"random text\", wantErr: true, want: nil},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := parsePrefix(tt.prefix)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"parsePrefix() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !reflect.DeepEqual(got, tt.want) {\n\t\t\t\tt.Errorf(\"parsePrefix() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_setImageName(t *testing.T) {\n\ttype args struct {\n\t\toldName           string\n\t\tnewNameComponents map[string]string\n\t}\n\ttests := []struct {\n\t\tname    string\n\t\targs    args\n\t\tflatten bool\n\t\twant    string\n\t}{\n\t\t{\n\t\t\tname:    \"replace registry\",\n\t\t\targs:    args{oldName: \"gcr.io/kubeflow-images-public/ingress-setup:latest\", newNameComponents: map[string]string{\"host\": \"test.io\"}},\n\t\t\tflatten: false,\n\t\t\twant:    \"test.io/kubeflow-images-public/ingress-setup:latest\",\n\t\t},\n\t\t{\n\t\t\tname:    \"add registry\",\n\t\t\targs:    args{oldName: \"mysql:latest\", newNameComponents: map[string]string{\"host\": \"test.io\"}},\n\t\t\tflatten: false,\n\t\t\twant:    \"test.io/mysql:latest\",\n\t\t},\n\t\t{\n\t\t\tname: \"replace registry/repository\",\n\t\t\targs: args{oldName: \"gcr.io/kubeflow-images-public/ingress-setup:latest\", newNameComponents: map[string]string{\"host\": \"test.io\", \"components\": \"myrepository\"}},\n\t\t\twant: \"test.io/myrepository/kubeflow-images-public/ingress-setup:latest\",\n\t\t},\n\t\t{\n\t\t\tname: \"replace registry/repository/subpath\",\n\t\t\targs: args{oldName: \"gcr.io/kubeflow-images-public/katib/vizier-core:v0.1.2-alpha-156-g4ab3dbd\", newNameComponents: map[string]string{\"host\": \"test.io\", \"components\": \"myrepository\"}},\n\t\t\twant: \"test.io/myrepository/kubeflow-images-public/katib/vizier-core:v0.1.2-alpha-156-g4ab3dbd\",\n\t\t},\n\t\t{\n\t\t\tname:    \"replace registry - flatten\",\n\t\t\targs:    args{oldName: \"gcr.io/kubeflow-images-public/ingress-setup:latest\", newNameComponents: map[string]string{\"host\": \"test.io\"}},\n\t\t\tflatten: true,\n\t\t\twant:    \"test.io/ingress-setup:latest\",\n\t\t},\n\t\t{\n\t\t\tname:    \"replace registry/repository - flatten\",\n\t\t\targs:    args{oldName: \"gcr.io/kubeflow-images-public/ingress-setup:latest\", newNameComponents: map[string]string{\"host\": \"test.io\", \"components\": \"myrepository\"}},\n\t\t\tflatten: true,\n\t\t\twant:    \"test.io/myrepository/ingress-setup:latest\",\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tflatten = tt.flatten\n\t\t\tif got := setImageName(tt.args.oldName, tt.args.newNameComponents); got != tt.want {\n\t\t\t\tt.Errorf(\"setImageName() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/show.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/coordinator\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/viper\"\n)\n\nvar showCfg = viper.New()\n\n// showCmd represents the show command\nvar showCmd = &cobra.Command{\n\tUse:   \"show [all(=default)|k8s|platform]\",\n\tShort: \"Show a generated kubeflow application.\",\n\tLong:  `Show a generated kubeflow application.`,\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tlog.SetLevel(log.InfoLevel)\n\t\tif showCfg.GetBool(string(kftypes.VERBOSE)) != true {\n\t\t\tlog.SetLevel(log.WarnLevel)\n\t\t}\n\t\tresource, resourceErr := processResourceArg(args)\n\t\tif resourceErr != nil {\n\t\t\treturn fmt.Errorf(\"invalid resource: %v\", resourceErr)\n\t\t}\n\t\tkfApp, kfAppErr := coordinator.NewLoadKfAppFromURI(configFilePath)\n\t\tif kfAppErr != nil {\n\t\t\treturn fmt.Errorf(\"couldn't load KfApp: %v\", kfAppErr)\n\t\t}\n\t\tshow, ok := kfApp.(kftypes.KfShow)\n\t\tif ok && show != nil {\n\t\t\tshowErr := show.Show(resource)\n\t\t\tif showErr != nil {\n\t\t\t\treturn fmt.Errorf(\"couldn't show KfApp: %v\", showErr)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t},\n}\n\nfunc init() {\n\talphaCmd.AddCommand(showCmd)\n\n\tshowCfg.SetConfigName(\"app\")\n\tshowCfg.SetConfigType(\"yaml\")\n\t// verbose output\n\tshowCmd.Flags().BoolP(string(kftypes.VERBOSE), \"V\", false,\n\t\tstring(kftypes.VERBOSE)+\" output default is false\")\n\tbindErr := showCfg.BindPFlag(string(kftypes.VERBOSE), showCmd.Flags().Lookup(string(kftypes.VERBOSE)))\n\tif bindErr != nil {\n\t\tlog.Errorf(\"Couldn't set flag --%v: %v\", string(kftypes.VERBOSE), bindErr)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "cmd/kfctl/cmd/version.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/spf13/cobra\"\n)\n\n// versionCmd represents the version command\nvar versionCmd = &cobra.Command{\n\tUse:   \"version\",\n\tShort: \"Print the version of kfctl.\",\n\tLong:  `Print the version of kfctl.`,\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tfmt.Println(rootCmd.Use + \" \" + VERSION)\n\t}}\n\nfunc init() {\n\trootCmd.AddCommand(versionCmd)\n\n\t// Here you will define your flags and configuration settings.\n\n\t// Cobra supports Persistent Flags which will work for this command\n\t// and all subcommands, e.g.:\n\t// versionCmd.PersistentFlags().String(\"foo\", \"\", \"A help for foo\")\n\n\t// Cobra supports local flags which will only run when this command\n\t// is called directly, e.g.:\n\t// versionCmd.Flags().BoolP(\"toggle\", \"t\", false, \"Help message for toggle\")\n}\n\nfunc versionfunc(cmd *cobra.Command, args []string) {\n\tfmt.Println(\"v20181207-4e7f4ed-198-gaeea303e-dirty-03e65e\")\n}\n"
  },
  {
    "path": "cmd/kfctl/main.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage main\n\nimport (\n\t\"github.com/kubeflow/kfctl/v3/cmd/kfctl/cmd\"\n\t\"github.com/onrik/logrus/filename\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\nvar (\n\t// VERSION is set during build\n\tVERSION = \"0.0.1\"\n)\n\nfunc init() {\n\t// Add filename as one of the fields of the structured log message.\n\tfilenameHook := filename.NewHook()\n\tfilenameHook.Field = \"filename\"\n\tlog.AddHook(filenameHook)\n}\n\nfunc main() {\n\tcmd.Execute(VERSION)\n}\n"
  },
  {
    "path": "cmd/manager/main.go",
    "content": "package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\n\t// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)\n\t_ \"k8s.io/client-go/plugin/pkg/client/auth\"\n\t\"k8s.io/client-go/rest\"\n\n\tapis \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/controller\"\n\n\t\"github.com/operator-framework/operator-sdk/pkg/k8sutil\"\n\tkubemetrics \"github.com/operator-framework/operator-sdk/pkg/kube-metrics\"\n\t\"github.com/operator-framework/operator-sdk/pkg/leader\"\n\t\"github.com/operator-framework/operator-sdk/pkg/log/zap\"\n\t\"github.com/operator-framework/operator-sdk/pkg/metrics\"\n\t\"github.com/operator-framework/operator-sdk/pkg/restmapper\"\n\tsdkVersion \"github.com/operator-framework/operator-sdk/version\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/pflag\"\n\tv1 \"k8s.io/api/core/v1\"\n\t\"k8s.io/apimachinery/pkg/util/intstr\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/config\"\n\t\"sigs.k8s.io/controller-runtime/pkg/manager\"\n\t\"sigs.k8s.io/controller-runtime/pkg/manager/signals\"\n)\n\n// Kubeflow operator version\nvar (\n\tVersion string = \"1.2.0\"\n)\n\n// Change below variables to serve metrics on different host or port.\nvar (\n\tmetricsHost               = \"0.0.0.0\"\n\tmetricsPort         int32 = 8383\n\toperatorMetricsPort int32 = 8686\n)\n\nfunc printVersion() {\n\tlog.Infof(\"Go Version: %s\", runtime.Version())\n\tlog.Infof(\"Go OS/Arch: %s/%s\", runtime.GOOS, runtime.GOARCH)\n\tlog.Infof(\"Version of operator-sdk: %v\", sdkVersion.Version)\n\tlog.Infof(\"Kubeflow version: %v\", Version)\n}\n\nfunc main() {\n\t// Add the zap logger flag set to the CLI. The flag set must\n\t// be added before calling pflag.Parse().\n\tpflag.CommandLine.AddFlagSet(zap.FlagSet())\n\n\t// Add flags registered by imported packages (e.g. glog and\n\t// controller-runtime)\n\tpflag.CommandLine.AddGoFlagSet(flag.CommandLine)\n\n\tpflag.Parse()\n\n\tprintVersion()\n\n\tnamespace, err := k8sutil.GetWatchNamespace()\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to get watch namespace. Error %v.\", err)\n\t\tos.Exit(1)\n\t}\n\n\t// Get a config to talk to the apiserver\n\tcfg, err := config.GetConfig()\n\tif err != nil {\n\t\tlog.Errorf(\"Error: %v.\", err)\n\t\tos.Exit(1)\n\t}\n\n\tctx := context.TODO()\n\t// Become the leader before proceeding\n\terr = leader.Become(ctx, \"kfctl-lock\")\n\tif err != nil {\n\t\tlog.Errorf(\"Error: %v.\", err)\n\t\tos.Exit(1)\n\t}\n\n\t// Create a new Cmd to provide shared dependencies and start components\n\tmgr, err := manager.New(cfg, manager.Options{\n\t\t// Watch all namespace\n\t\tNamespace:          \"\",\n\t\tMapperProvider:     restmapper.NewDynamicRESTMapper,\n\t\tMetricsBindAddress: fmt.Sprintf(\"%s:%d\", metricsHost, metricsPort),\n\t})\n\tif err != nil {\n\t\tlog.Errorf(\"Error: %v.\", err)\n\t\tos.Exit(1)\n\t}\n\n\tlog.Info(\"Registering Components.\")\n\n\t// Setup Scheme for all resources\n\tif err := apis.AddToScheme(mgr.GetScheme()); err != nil {\n\t\tlog.Errorf(\"Error: %v.\", err)\n\t\tos.Exit(1)\n\t}\n\n\t// Setup all Controllers\n\tif err := controller.AddToManager(mgr); err != nil {\n\t\tlog.Errorf(\"Error: %v.\", err)\n\t\tos.Exit(1)\n\t}\n\n\tif err = serveCRMetrics(cfg); err != nil {\n\t\tlog.Errorf(\"Could not generate and serve custom resource metrics. Error: %v.\", err.Error())\n\t}\n\n\t// Add to the below struct any other metrics ports you want to expose.\n\tservicePorts := []v1.ServicePort{\n\t\t{Port: metricsPort, Name: metrics.OperatorPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: metricsPort}},\n\t\t{Port: operatorMetricsPort, Name: metrics.CRPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: operatorMetricsPort}},\n\t}\n\t// Create Service object to expose the metrics port(s).\n\tservice, err := metrics.CreateMetricsService(ctx, cfg, servicePorts)\n\tif err != nil {\n\t\tlog.Errorf(\"Could not create metrics Service. Error: %v.\", err.Error())\n\t}\n\n\t// CreateServiceMonitors will automatically create the prometheus-operator ServiceMonitor resources\n\t// necessary to configure Prometheus to scrape metrics from this operator.\n\tservices := []*v1.Service{service}\n\t_, err = metrics.CreateServiceMonitors(cfg, namespace, services)\n\tif err != nil {\n\t\tlog.Errorf(\"Could not create ServiceMonitor object. Error: %v.\", err.Error())\n\t\t// If this operator is deployed to a cluster without the prometheus-operator running, it will return\n\t\t// ErrServiceMonitorNotPresent, which can be used to safely skip ServiceMonitor creation.\n\t\tif err == metrics.ErrServiceMonitorNotPresent {\n\t\t\tlog.Errorf(\"Install prometheus-operator in your cluster to create ServiceMonitor objects. Error: %v.\", err.Error())\n\t\t}\n\t}\n\n\tlog.Infof(\"Starting the Cmd.\")\n\n\t// Start the Cmd\n\tif err := mgr.Start(signals.SetupSignalHandler()); err != nil {\n\t\tlog.Errorf(\"Manager exited non-zero. Error: %v.\", err)\n\t\tos.Exit(1)\n\t}\n}\n\n// serveCRMetrics gets the Operator/CustomResource GVKs and generates metrics based on those types.\n// It serves those metrics on \"http://metricsHost:operatorMetricsPort\".\nfunc serveCRMetrics(cfg *rest.Config) error {\n\t// Below function returns filtered operator/CustomResource specific GVKs.\n\t// For more control override the below GVK list with your own custom logic.\n\tfilteredGVK, err := k8sutil.GetGVKsFromAddToScheme(apis.AddToScheme)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Get the namespace the operator is currently deployed in.\n\toperatorNs, err := k8sutil.GetOperatorNamespace()\n\tif err != nil {\n\t\treturn err\n\t}\n\t// To generate metrics in other namespaces, add the values below.\n\tns := []string{operatorNs}\n\t// Generate and serve custom resource specific metrics.\n\terr = kubemetrics.GenerateAndServeCRMetrics(cfg, ns, filteredGVK, metricsHost, operatorMetricsPort)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/plugins/dockerfordesktop/dockerfordesktop.go",
    "content": "package main\n\nimport (\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tcltypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/dockerfordesktop\"\n)\n\nfunc GetKfApp(client *cltypes.KfDef) kftypes.KfApp {\n\treturn dockerfordesktop.GetKfApp(client)\n}\n"
  },
  {
    "path": "config/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package config contains API Schema definitions\n// +k8s:deepcopy-gen=package\n\npackage config\n"
  },
  {
    "path": "config/types.go",
    "content": "/*\nCopyright The Kubeflow Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage config\n\ntype NameValue struct {\n\tName         string `json:\"name,omitempty\"`\n\tValue        string `json:\"value,omitempty\"`\n\tInitRequired bool   `json:\"initRequired,omitempty\"`\n}\n\ntype Parameters map[string][]NameValue\n\n// Default components configuration definitions.\ntype ComponentConfig struct {\n\t// Name of repository.\n\tRepo string `json:\"repo,omitempty\"`\n\t// List of default components.\n\t// +patchStrategy=merge\n\tComponents []string `json:\"components,omitempty\" patchStrategy:\"merge\"`\n\t// List of default packages.\n\t// +patchStrategy=merge\n\tPackages []string `json:\"packages,omitempty\" patchStrategy:\"merge\"`\n\t// Parameters to be set to components using ks param set.\n\t// +patchStrategy=merge,retainKeys\n\tComponentParams Parameters `json:\"componentParams,omitempty\" patchStrategy:\"merge,retainKeys\"`\n\t// Platform type.\n\tPlatform string `json:\"platform,omitempty\"`\n}\n\n// StorageOption store user choice of permanent storage\ntype StorageOption struct {\n\t// Whether to create persistent storage for storing all Kubeflow Pipeline artifacts or not.\n\tCreatePipelinePersistentStorage bool\n}\n"
  },
  {
    "path": "config/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage config\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ComponentConfig) DeepCopyInto(out *ComponentConfig) {\n\t*out = *in\n\tif in.Components != nil {\n\t\tin, out := &in.Components, &out.Components\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Packages != nil {\n\t\tin, out := &in.Packages, &out.Packages\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.ComponentParams != nil {\n\t\tin, out := &in.ComponentParams, &out.ComponentParams\n\t\t*out = make(Parameters, len(*in))\n\t\tfor key, val := range *in {\n\t\t\tvar outVal []NameValue\n\t\t\tif val == nil {\n\t\t\t\t(*out)[key] = nil\n\t\t\t} else {\n\t\t\t\tin, out := &val, &outVal\n\t\t\t\t*out = make([]NameValue, len(*in))\n\t\t\t\tcopy(*out, *in)\n\t\t\t}\n\t\t\t(*out)[key] = outVal\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentConfig.\nfunc (in *ComponentConfig) DeepCopy() *ComponentConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ComponentConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *NameValue) DeepCopyInto(out *NameValue) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NameValue.\nfunc (in *NameValue) DeepCopy() *NameValue {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(NameValue)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in Parameters) DeepCopyInto(out *Parameters) {\n\t{\n\t\tin := &in\n\t\t*out = make(Parameters, len(*in))\n\t\tfor key, val := range *in {\n\t\t\tvar outVal []NameValue\n\t\t\tif val == nil {\n\t\t\t\t(*out)[key] = nil\n\t\t\t} else {\n\t\t\t\tin, out := &val, &outVal\n\t\t\t\t*out = make([]NameValue, len(*in))\n\t\t\t\tcopy(*out, *in)\n\t\t\t}\n\t\t\t(*out)[key] = outVal\n\t\t}\n\t\treturn\n\t}\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Parameters.\nfunc (in Parameters) DeepCopy() Parameters {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Parameters)\n\tin.DeepCopyInto(out)\n\treturn *out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *StorageOption) DeepCopyInto(out *StorageOption) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageOption.\nfunc (in *StorageOption) DeepCopy() *StorageOption {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(StorageOption)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "deploy/cluster_role_binding.yaml",
    "content": "kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: kubeflow-operator\nsubjects:\n- kind: ServiceAccount\n  name: kubeflow-operator\n  namespace: $(namespace) # Replace it with operator's namespace\nroleRef:\n  kind: ClusterRole\n  name: cluster-admin\n  apiGroup: rbac.authorization.k8s.io\n"
  },
  {
    "path": "deploy/crds/kfdef.apps.kubeflow.org_kfdefs_crd.yaml",
    "content": "apiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: kfdefs.kfdef.apps.kubeflow.org\nspec:\n  group: kfdef.apps.kubeflow.org\n  names:\n    kind: KfDef\n    listKind: KfDefList\n    plural: kfdefs\n    singular: kfdef\n  scope: Namespaced\n  subresources:\n    status: {}\n  validation:\n    openAPIV3Schema:\n      description: KfDef is the Schema for the kfdefs API\n      properties:\n        apiVersion:\n          description: 'APIVersion defines the versioned schema of this representation\n            of an object. Servers should convert recognized schemas to the latest\n            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'\n          type: string\n        kind:\n          description: 'Kind is a string value representing the REST resource this\n            object represents. Servers may infer this from the endpoint the client\n            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'\n          type: string\n        metadata:\n          type: object\n        spec:\n          description: KfDefSpec defines the desired state of KfDef\n          type: object\n        status:\n          description: KfDefStatus defines the observed state of KfDef\n          type: object\n      type: object\n  version: v1\n  versions:\n  - name: v1\n    served: true\n    storage: true\n"
  },
  {
    "path": "deploy/crds/kustomization.yaml",
    "content": "resources:\n- kfdef.apps.kubeflow.org_kfdefs_crd.yaml\n"
  },
  {
    "path": "deploy/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n- ./crds\n- ./service_account.yaml\n- ./role.yaml\n- ./cluster_role_binding.yaml\n- ./operator.yaml\nvars:\n- fieldref:\n    fieldPath: metadata.namespace\n  name: namespace\n  objref:\n    apiVersion: apps/v1\n    kind: Deployment\n    name: kubeflow-operator\n\nconfigurations:\n- ./params.yaml\nnamespace: operators\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/0.1.0/kfdef.apps.kubeflow.org.crd.yaml",
    "content": "apiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: kfdefs.kfdef.apps.kubeflow.org\n  labels:\n    component: kubeflow-operator\nspec:\n  group: kfdef.apps.kubeflow.org\n  names:\n    kind: KfDef\n    listKind: KfDefList\n    plural: kfdefs\n    singular: kfdef\n  scope: Namespaced\n  subresources:\n    status: {}\n  validation:\n    openAPIV3Schema:\n      description: KfDef is the Schema for the kfdefs API\n      properties:\n        apiVersion:\n          description: 'APIVersion defines the versioned schema of this representation\n            of an object. Servers should convert recognized schemas to the latest\n            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'\n          type: string\n        kind:\n          description: 'Kind is a string value representing the REST resource this\n            object represents. Servers may infer this from the endpoint the client\n            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'\n          type: string\n        metadata:\n          type: object\n        spec:\n          description: KfDefSpec defines the desired state of KfDef\n          type: object\n        status:\n          description: KfDefStatus defines the observed state of KfDef\n          type: object\n      type: object\n  version: v1\n  versions:\n  - name: v1\n    served: true\n    storage: true\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/0.1.0/kubeflow.v0.1.0.clusterserviceversion.yaml",
    "content": "apiVersion: operators.coreos.com/v1alpha1\nkind: ClusterServiceVersion\nmetadata:\n  annotations:\n    alm-examples: '[{\"apiVersion\":\"kfdef.apps.kubeflow.org/v1\",\"kind\":\"KfDef\",\"metadata\":{\"name\":\"kubeflow-deployment\",\"namespace\":\"kubeflow\"},\"spec\":{\"applications\":[{\"kustomizeConfig\":{\"parameters\":[{\"name\":\"namespace\",\"value\":\"istio-system\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"istio/istio-crds\"}},\"name\":\"istio-crds\"},{\"kustomizeConfig\":{\"parameters\":[{\"name\":\"namespace\",\"value\":\"istio-system\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"istio/istio-install\"}},\"name\":\"istio-install\"},{\"kustomizeConfig\":{\"parameters\":[{\"name\":\"clusterRbacConfig\",\"value\":\"OFF\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"istio/istio\"}},\"name\":\"istio\"},{\"kustomizeConfig\":{\"repoRef\":{\"name\":\"manifests\",\"path\":\"application/application-crds\"}},\"name\":\"application-crds\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"application/application\"}},\"name\":\"application\"},{\"kustomizeConfig\":{\"parameters\":[{\"name\":\"namespace\",\"value\":\"cert-manager\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"cert-manager/cert-manager-crds\"}},\"name\":\"cert-manager-crds\"},{\"kustomizeConfig\":{\"parameters\":[{\"name\":\"namespace\",\"value\":\"kube-system\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"cert-manager/cert-manager-kube-system-resources\"}},\"name\":\"cert-manager-kube-system-resources\"},{\"kustomizeConfig\":{\"overlays\":[\"self-signed\",\"application\"],\"parameters\":[{\"name\":\"namespace\",\"value\":\"cert-manager\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"cert-manager/cert-manager\"}},\"name\":\"cert-manager\"},{\"kustomizeConfig\":{\"repoRef\":{\"name\":\"manifests\",\"path\":\"metacontroller\"}},\"name\":\"metacontroller\"},{\"kustomizeConfig\":{\"overlays\":[\"istio\",\"application\"],\"parameters\":[{\"name\":\"containerRuntimeExecutor\",\"value\":\"pns\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"argo\"}},\"name\":\"argo\"},{\"kustomizeConfig\":{\"repoRef\":{\"name\":\"manifests\",\"path\":\"kubeflow-roles\"}},\"name\":\"kubeflow-roles\"},{\"kustomizeConfig\":{\"overlays\":[\"istio\",\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"common/centraldashboard\"}},\"name\":\"centraldashboard\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"admission-webhook/bootstrap\"}},\"name\":\"bootstrap\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"admission-webhook/webhook\"}},\"name\":\"webhook\"},{\"kustomizeConfig\":{\"overlays\":[\"istio\",\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"jupyter/jupyter-web-app\"}},\"name\":\"jupyter-web-app\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"spark/spark-operator\"}},\"name\":\"spark-operator\"},{\"kustomizeConfig\":{\"overlays\":[\"istio\",\"application\",\"ibm-storage-config\",\"db\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"metadata\"}},\"name\":\"metadata\"},{\"kustomizeConfig\":{\"overlays\":[\"istio\",\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"jupyter/notebook-controller\"}},\"name\":\"notebook-controller\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pytorch-job/pytorch-job-crds\"}},\"name\":\"pytorch-job-crds\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pytorch-job/pytorch-operator\"}},\"name\":\"pytorch-operator\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"parameters\":[{\"name\":\"namespace\",\"value\":\"knative-serving\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"knative/knative-serving-crds\"}},\"name\":\"knative-crds\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"parameters\":[{\"name\":\"namespace\",\"value\":\"knative-serving\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"knative/knative-serving-install\"}},\"name\":\"knative-install\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"kfserving/kfserving-crds\"}},\"name\":\"kfserving-crds\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"kfserving/kfserving-install\"}},\"name\":\"kfserving-install\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"parameters\":[{\"name\":\"usageId\",\"value\":\"<randomly-generated-id>\"},{\"name\":\"reportUsage\",\"value\":\"true\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"common/spartakus\"}},\"name\":\"spartakus\"},{\"kustomizeConfig\":{\"overlays\":[\"istio\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"tensorboard\"}},\"name\":\"tensorboard\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"tf-training/tf-job-crds\"}},\"name\":\"tf-job-crds\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"tf-training/tf-job-operator\"}},\"name\":\"tf-job-operator\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"katib/katib-crds\"}},\"name\":\"katib-crds\"},{\"kustomizeConfig\":{\"overlays\":[\"application\",\"istio\",\"ibm-storage-config\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"katib/katib-controller\"}},\"name\":\"katib-controller\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/api-service\"}},\"name\":\"api-service\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"parameters\":[{\"name\":\"minioPvcName\",\"value\":\"minio-pv-claim\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/minio\"}},\"name\":\"minio\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"parameters\":[{\"name\":\"mysqlPvcName\",\"value\":\"mysql-pv-claim\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/mysql\"}},\"name\":\"mysql\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/persistent-agent\"}},\"name\":\"persistent-agent\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/pipelines-runner\"}},\"name\":\"pipelines-runner\"},{\"kustomizeConfig\":{\"overlays\":[\"istio\",\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/pipelines-ui\"}},\"name\":\"pipelines-ui\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/pipelines-viewer\"}},\"name\":\"pipelines-viewer\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/scheduledworkflow\"}},\"name\":\"scheduledworkflow\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"pipeline/pipeline-visualization-service\"}},\"name\":\"pipeline-visualization-service\"},{\"kustomizeConfig\":{\"overlays\":[\"application\",\"istio\"],\"parameters\":[{\"name\":\"admin\",\"value\":\"example@kubeflow.org\"}],\"repoRef\":{\"name\":\"manifests\",\"path\":\"profiles\"}},\"name\":\"profiles\"},{\"kustomizeConfig\":{\"overlays\":[\"application\"],\"repoRef\":{\"name\":\"manifests\",\"path\":\"seldon/seldon-core-operator\"}},\"name\":\"seldon-core-operator\"}],\"repos\":[{\"name\":\"manifests\",\"uri\":\"https://github.com/kubeflow/manifests/archive/v0.7-branch.tar.gz\"}],\"version\":\"v0.7.1\"}}]'\n    capabilities: Basic Install\n    categories: \"AI/Machine Learning\"\n    description: \"Kubeflow Operator for deployment and management of Kubeflow\"\n    support: Kubeflow\n    repository: https://github.com/kubeflow/kfctl\n    createdAt: '2020-02-05T00:00:00Z'\n    containerImage: aipipeline/kubeflow-operator:v0.1.0\n    certified: 'False'\n  name: kubeflow.v0.1.0\n  namespace: placeholder\nspec:\n  apiservicedefinitions: {}\n  customresourcedefinitions:\n    owned:\n    - description: KfDef is the Schema for the applications API\n      kind: KfDef\n      name: kfdefs.kfdef.apps.kubeflow.org\n      version: v1\n      displayName: Kubeflow\n      group: kfdef.apps.kubeflow.org\n  description: \"Kubeflow Operator for deployment and management of Kubeflow components. Applicable for Kubeflow versions 0.7. Check [Kubeflow Operator documentation](https://github.com/kubeflow/kfctl/blob/master/operator.md) for more details.\"\n  displayName: Kubeflow\n  icon: \n  - base64data: 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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v/24IAEAAAAQND/1+0IVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AlHxsDwoTtjWwAAAABJRU5ErkJggg==\n    mediatype: image/png   \n  install:\n    spec:\n      clusterPermissions:\n      - rules:\n        - apiGroups:\n          - '*'\n          resources:\n          - '*'\n          verbs:\n          - '*'\n        - nonResourceURLs:\n          - '*'\n          verbs:\n          - '*'\n        serviceAccountName: kubeflow-operator\n      deployments:\n      - name: kubeflow-operator\n        spec:\n          replicas: 1\n          selector:\n            matchLabels:\n              name: kubeflow-operator\n          strategy: {}\n          template:\n            metadata:\n              labels:\n                name: kubeflow-operator\n            spec:\n              containers:\n              - command:\n                - kfctl\n                env:\n                - name: WATCH_NAMESPACE\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.annotations['olm.targetNamespaces']\n                - name: POD_NAME\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.name\n                - name: OPERATOR_NAME\n                  value: kubeflow-operator\n                image: aipipeline/kubeflow-operator:v0.1.0\n                imagePullPolicy: Always\n                name: kubeflow-operator\n                resources: {}\n              serviceAccountName: kubeflow-operator\n    strategy: deployment\n  installModes:\n  - supported: true\n    type: OwnNamespace\n  - supported: true\n    type: SingleNamespace\n  - supported: false\n    type: MultiNamespace\n  - supported: true\n    type: AllNamespaces\n  maturity: alpha\n  links:\n  - name: Kubeflow\n    url: https://www.kubeflow.org/\n  provider:\n    name: Kubeflow\n  maintainers:\n    - name: Animesh Singh\n      email: singhan@us.ibm.com\n    - name: Tommy Li\n      email: tommy.chaoping.li@ibm.com\n    - name: Weiqiang Zhuang\n      email: wzhuang@us.ibm.com\n  keywords: \n    - Kubeflow\n    - Operator\n    - IBMCloud\n    - GCP\n    - OpenShift\n  version: 0.1.0\n  selector:\n    matchLabels:\n      component: kubeflow-operator\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/1.0.0/kfdef.apps.kubeflow.org.crd.yaml",
    "content": "apiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: kfdefs.kfdef.apps.kubeflow.org\n  labels:\n    component: kubeflow-operator\nspec:\n  group: kfdef.apps.kubeflow.org\n  names:\n    kind: KfDef\n    listKind: KfDefList\n    plural: kfdefs\n    singular: kfdef\n  scope: Namespaced\n  subresources:\n    status: {}\n  validation:\n    openAPIV3Schema:\n      description: KfDef is the Schema for the kfdefs API\n      properties:\n        apiVersion:\n          description: 'APIVersion defines the versioned schema of this representation\n            of an object. Servers should convert recognized schemas to the latest\n            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'\n          type: string\n        kind:\n          description: 'Kind is a string value representing the REST resource this\n            object represents. Servers may infer this from the endpoint the client\n            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'\n          type: string\n        metadata:\n          type: object\n        spec:\n          description: KfDefSpec defines the desired state of KfDef\n          type: object\n        status:\n          description: KfDefStatus defines the observed state of KfDef\n          type: object\n      type: object\n  version: v1\n  versions:\n  - name: v1\n    served: true\n    storage: true\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/1.0.0/kubeflow.v1.0.0.clusterserviceversion.yaml",
    "content": "apiVersion: operators.coreos.com/v1alpha1\nkind: ClusterServiceVersion\nmetadata:\n  annotations:\n    alm-examples: '[{\"apiVersion\": \"kfdef.apps.kubeflow.org/v1\", \"kind\": \"KfDef\", \"metadata\": { \"name\": \"kubeflow\", \"namespace\": \"kubeflow\" }, \"spec\": { \"applications\": [ { \"kustomizeConfig\": { \"parameters\": [ { \"name\": \"namespace\", \"value\": \"istio-system\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"istio/istio-crds\" } }, \"name\": \"istio-crds\" }, { \"kustomizeConfig\": { \"parameters\": [ { \"name\": \"namespace\", \"value\": \"istio-system\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"istio/istio-install\" } }, \"name\": \"istio-install\" }, { \"kustomizeConfig\": { \"parameters\": [ { \"name\": \"namespace\", \"value\": \"istio-system\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"istio/cluster-local-gateway\" } }, \"name\": \"cluster-local-gateway\" }, { \"kustomizeConfig\": { \"parameters\": [ { \"name\": \"clusterRbacConfig\", \"value\": \"OFF\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"istio/istio\" } }, \"name\": \"istio\" }, { \"kustomizeConfig\": { \"parameters\": [ { \"name\": \"namespace\", \"value\": \"istio-system\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"istio/add-anonymous-user-filter\" } }, \"name\": \"add-anonymous-user-filter\" }, { \"kustomizeConfig\": { \"repoRef\": { \"name\": \"manifests\", \"path\": \"application/application-crds\" } }, \"name\": \"application-crds\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"application/application\" } }, \"name\": \"application\" }, { \"kustomizeConfig\": { \"parameters\": [ { \"name\": \"namespace\", \"value\": \"cert-manager\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"cert-manager/cert-manager-crds\" } }, \"name\": \"cert-manager-crds\" }, { \"kustomizeConfig\": { \"parameters\": [ { \"name\": \"namespace\", \"value\": \"kube-system\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"cert-manager/cert-manager-kube-system-resources\" } }, \"name\": \"cert-manager-kube-system-resources\" }, { \"kustomizeConfig\": { \"overlays\": [ \"self-signed\", \"application\" ], \"parameters\": [ { \"name\": \"namespace\", \"value\": \"cert-manager\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"cert-manager/cert-manager\" } }, \"name\": \"cert-manager\" }, { \"kustomizeConfig\": { \"repoRef\": { \"name\": \"manifests\", \"path\": \"metacontroller\" } }, \"name\": \"metacontroller\" }, { \"kustomizeConfig\": { \"overlays\": [ \"istio\", \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"argo\" } }, \"name\": \"argo\" }, { \"kustomizeConfig\": { \"repoRef\": { \"name\": \"manifests\", \"path\": \"kubeflow-roles\" } }, \"name\": \"kubeflow-roles\" }, { \"kustomizeConfig\": { \"overlays\": [ \"istio\", \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"common/centraldashboard\" } }, \"name\": \"centraldashboard\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"admission-webhook/bootstrap\" } }, \"name\": \"bootstrap\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"admission-webhook/webhook\" } }, \"name\": \"webhook\" }, { \"kustomizeConfig\": { \"overlays\": [ \"istio\", \"application\" ], \"parameters\": [ { \"name\": \"userid-header\", \"value\": \"kubeflow-userid\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"jupyter/jupyter-web-app\" } }, \"name\": \"jupyter-web-app\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"spark/spark-operator\" } }, \"name\": \"spark-operator\" }, { \"kustomizeConfig\": { \"overlays\": [ \"istio\", \"application\", \"db\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"metadata\" } }, \"name\": \"metadata\" }, { \"kustomizeConfig\": { \"overlays\": [ \"istio\", \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"jupyter/notebook-controller\" } }, \"name\": \"notebook-controller\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pytorch-job/pytorch-job-crds\" } }, \"name\": \"pytorch-job-crds\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pytorch-job/pytorch-operator\" } }, \"name\": \"pytorch-operator\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"parameters\": [ { \"name\": \"namespace\", \"value\": \"knative-serving\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"knative/knative-serving-crds\" } }, \"name\": \"knative-crds\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"parameters\": [ { \"name\": \"namespace\", \"value\": \"knative-serving\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"knative/knative-serving-install\" } }, \"name\": \"knative-install\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"kfserving/kfserving-crds\" } }, \"name\": \"kfserving-crds\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"kfserving/kfserving-install\" } }, \"name\": \"kfserving-install\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"parameters\": [ { \"name\": \"usageId\", \"value\": \"<randomly-generated-id>\" }, { \"name\": \"reportUsage\", \"value\": \"true\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"common/spartakus\" } }, \"name\": \"spartakus\" }, { \"kustomizeConfig\": { \"overlays\": [ \"istio\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"tensorboard\" } }, \"name\": \"tensorboard\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"tf-training/tf-job-crds\" } }, \"name\": \"tf-job-crds\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"tf-training/tf-job-operator\" } }, \"name\": \"tf-job-operator\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"katib/katib-crds\" } }, \"name\": \"katib-crds\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\", \"istio\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"katib/katib-controller\" } }, \"name\": \"katib-controller\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/api-service\" } }, \"name\": \"api-service\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"parameters\": [ { \"name\": \"minioPvcName\", \"value\": \"minio-pv-claim\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/minio\" } }, \"name\": \"minio\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"parameters\": [ { \"name\": \"mysqlPvcName\", \"value\": \"mysql-pv-claim\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/mysql\" } }, \"name\": \"mysql\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/persistent-agent\" } }, \"name\": \"persistent-agent\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/pipelines-runner\" } }, \"name\": \"pipelines-runner\" }, { \"kustomizeConfig\": { \"overlays\": [ \"istio\", \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/pipelines-ui\" } }, \"name\": \"pipelines-ui\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/pipelines-viewer\" } }, \"name\": \"pipelines-viewer\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/scheduledworkflow\" } }, \"name\": \"scheduledworkflow\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"pipeline/pipeline-visualization-service\" } }, \"name\": \"pipeline-visualization-service\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\", \"istio\" ], \"parameters\": [ { \"name\": \"admin\", \"value\": \"johnDoe@acme.com\" } ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"profiles\" } }, \"name\": \"profiles\" }, { \"kustomizeConfig\": { \"overlays\": [ \"application\" ], \"repoRef\": { \"name\": \"manifests\", \"path\": \"seldon/seldon-core-operator\" } }, \"name\": \"seldon-core-operator\" } ], \"repos\": [ { \"name\": \"manifests\", \"uri\": \"https://github.com/kubeflow/manifests/archive/v1.0.0.tar.gz\" } ], \"version\": \"v1.0.0\" } }]'\n    capabilities: Basic Install\n    categories: \"AI/Machine Learning\"\n    description: \"Kubeflow Operator for deployment and management of Kubeflow\"\n    support: Kubeflow\n    repository: https://github.com/kubeflow/kfctl\n    createdAt: '2020-03-19T00:00:00Z'\n    containerImage: aipipeline/kubeflow-operator:v1.0.0\n    certified: 'False'\n  name: kubeflow.v1.0.0\n  namespace: placeholder\nspec:\n  apiservicedefinitions: {}\n  customresourcedefinitions:\n    owned:\n    - description: KfDef is the Schema for the applications API\n      kind: KfDef\n      name: kfdefs.kfdef.apps.kubeflow.org\n      version: v1\n      displayName: Kubeflow\n      group: kfdef.apps.kubeflow.org\n  description: \"Kubeflow Operator for deployment and management of Kubeflow components. Applicable for Kubeflow versions 1.0 and above. Check [Kubeflow Operator documentation](https://github.com/kubeflow/kfctl/blob/master/operator.md) for more details.\"\n  displayName: Kubeflow\n  icon: \n  - base64data: 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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v/24IAEAAAAQND/1+0IVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AlHxsDwoTtjWwAAAABJRU5ErkJggg==\n    mediatype: image/png   \n  install:\n    spec:\n      clusterPermissions:\n      - rules:\n        - apiGroups:\n          - '*'\n          resources:\n          - '*'\n          verbs:\n          - '*'\n        - nonResourceURLs:\n          - '*'\n          verbs:\n          - '*'\n        serviceAccountName: kubeflow-operator\n      deployments:\n      - name: kubeflow-operator\n        spec:\n          replicas: 1\n          selector:\n            matchLabels:\n              name: kubeflow-operator\n          strategy: {}\n          template:\n            metadata:\n              labels:\n                name: kubeflow-operator\n            spec:\n              containers:\n              - command:\n                - kfctl\n                env:\n                - name: WATCH_NAMESPACE\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.annotations['olm.targetNamespaces']\n                - name: POD_NAME\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.name\n                - name: OPERATOR_NAME\n                  value: kubeflow-operator\n                image: aipipeline/kubeflow-operator:v1.0.0\n                imagePullPolicy: Always\n                name: kubeflow-operator\n                resources: {}\n              serviceAccountName: kubeflow-operator\n    strategy: deployment\n  installModes:\n  - supported: true\n    type: OwnNamespace\n  - supported: true\n    type: SingleNamespace\n  - supported: false\n    type: MultiNamespace\n  - supported: true\n    type: AllNamespaces\n  maturity: alpha\n  links:\n  - name: Kubeflow\n    url: https://www.kubeflow.org/\n  provider:\n    name: Kubeflow\n  maintainers:\n    - name: Animesh Singh\n      email: singhan@us.ibm.com\n    - name: Tommy Li\n      email: tommy.chaoping.li@ibm.com\n    - name: Weiqiang Zhuang\n      email: wzhuang@us.ibm.com\n  keywords: \n    - Kubeflow\n    - Operator\n    - IBMCloud\n    - GCP\n    - OpenShift\n  version: 1.0.0\n  replaces: kubeflow.v0.1.0\n  selector:\n    matchLabels:\n      component: kubeflow-operator\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/1.1.0/kfdef.apps.kubeflow.org.crd.yaml",
    "content": "apiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: kfdefs.kfdef.apps.kubeflow.org\n  labels:\n    component: kubeflow-operator\nspec:\n  group: kfdef.apps.kubeflow.org\n  names:\n    kind: KfDef\n    listKind: KfDefList\n    plural: kfdefs\n    singular: kfdef\n  scope: Namespaced\n  subresources:\n    status: {}\n  validation:\n    openAPIV3Schema:\n      description: KfDef is the Schema for the kfdefs API\n      properties:\n        apiVersion:\n          description: 'APIVersion defines the versioned schema of this representation\n            of an object. Servers should convert recognized schemas to the latest\n            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'\n          type: string\n        kind:\n          description: 'Kind is a string value representing the REST resource this\n            object represents. Servers may infer this from the endpoint the client\n            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'\n          type: string\n        metadata:\n          type: object\n        spec:\n          description: KfDefSpec defines the desired state of KfDef\n          type: object\n        status:\n          description: KfDefStatus defines the observed state of KfDef\n          type: object\n      type: object\n  version: v1\n  versions:\n  - name: v1\n    served: true\n    storage: true\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/1.1.0/kubeflow.v1.1.0.clusterserviceversion.yaml",
    "content": "apiVersion: operators.coreos.com/v1alpha1\nkind: ClusterServiceVersion\nmetadata:\n  annotations:\n    alm-examples: >-\n      [\n      {\n        \"apiVersion\": \"kfdef.apps.kubeflow.org/v1\",\n        \"kind\": \"KfDef\",\n        \"metadata\": {\n            \"name\": \"kubeflow\",\n            \"namespace\": \"kubeflow\"\n        },\n        \"spec\": {\n            \"applications\": [\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/istio-stack\"\n                    }\n                  },\n                  \"name\": \"istio-stack\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cluster-local-gateway\"\n                    }\n                  },\n                  \"name\": \"cluster-local-gateway\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/istio\"\n                    }\n                  },\n                  \"name\": \"istio\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/add-anonymous-user-filter\"\n                    }\n                  },\n                  \"name\": \"add-anonymous-user-filter\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"application/v3\"\n                    }\n                  },\n                  \"name\": \"application\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/bootstrap\"\n                    }\n                  },\n                  \"name\": \"bootstrap\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cert-manager-crds\"\n                    }\n                  },\n                  \"name\": \"cert-manager-crds\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cert-manager-kube-system-resources\"\n                    }\n                  },\n                  \"name\": \"cert-manager-kube-system-resources\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cert-manager\"\n                    }\n                  },\n                  \"name\": \"cert-manager\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm\"\n                    }\n                  },\n                  \"name\": \"kubeflow-apps\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"metacontroller/base\"\n                    }\n                  },\n                  \"name\": \"metacontroller\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/metadata\"\n                    }\n                  },\n                  \"name\": \"metadata\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/spark-operator\"\n                    }\n                  },\n                  \"name\": \"spark-operator\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"knative/installs/generic\"\n                    }\n                  },\n                  \"name\": \"knative\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"kfserving/installs/generic\"\n                    }\n                  },\n                  \"name\": \"kfserving\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/spartakus\"\n                    }\n                  },\n                  \"name\": \"spartakus\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/tensorboard\"\n                    }\n                  },\n                  \"name\": \"tensorboard\"\n              }\n            ],\n            \"repos\": [\n              {\n                  \"name\": \"manifests\",\n                  \"uri\": \"https://github.com/kubeflow/manifests/archive/v1.1.0.tar.gz\"\n              }\n            ],\n            \"version\": \"v1.1.0\"\n        }\n      }\n      ]\n    capabilities: Basic Install\n    categories: \"AI/Machine Learning\"\n    description: \"Kubeflow Operator for deployment and management of Kubeflow\"\n    support: Kubeflow\n    repository: https://github.com/kubeflow/kfctl\n    createdAt: '2020-03-19T00:00:00Z'\n    containerImage: aipipeline/kubeflow-operator:v1.1.0\n    certified: 'False'\n  name: kubeflow.v1.1.0\n  namespace: placeholder\nspec:\n  apiservicedefinitions: {}\n  customresourcedefinitions:\n    owned:\n    - description: KfDef is the Schema for the applications API\n      kind: KfDef\n      name: kfdefs.kfdef.apps.kubeflow.org\n      version: v1\n      displayName: Kubeflow\n      group: kfdef.apps.kubeflow.org\n  description: \"Kubeflow Operator for deployment and management of Kubeflow components. Applicable for Kubeflow versions 1.0 and above. Check [Kubeflow Operator documentation](https://github.com/kubeflow/kfctl/blob/master/operator.md) for more details.\"\n  displayName: Kubeflow\n  icon: \n  - base64data: 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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v/24IAEAAAAQND/1+0IVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AlHxsDwoTtjWwAAAABJRU5ErkJggg==\n    mediatype: image/png   \n  install:\n    spec:\n      clusterPermissions:\n      - rules:\n        - apiGroups:\n          - '*'\n          resources:\n          - '*'\n          verbs:\n          - '*'\n        - nonResourceURLs:\n          - '*'\n          verbs:\n          - '*'\n        serviceAccountName: kubeflow-operator\n      deployments:\n      - name: kubeflow-operator\n        spec:\n          replicas: 1\n          selector:\n            matchLabels:\n              name: kubeflow-operator\n          strategy: {}\n          template:\n            metadata:\n              labels:\n                name: kubeflow-operator\n            spec:\n              containers:\n              - command:\n                - kfctl\n                env:\n                - name: WATCH_NAMESPACE\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.annotations['olm.targetNamespaces']\n                - name: POD_NAME\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.name\n                - name: OPERATOR_NAME\n                  value: kubeflow-operator\n                image: aipipeline/kubeflow-operator:v1.1.0\n                imagePullPolicy: Always\n                name: kubeflow-operator\n                resources: {}\n              serviceAccountName: kubeflow-operator\n    strategy: deployment\n  installModes:\n  - supported: true\n    type: OwnNamespace\n  - supported: true\n    type: SingleNamespace\n  - supported: false\n    type: MultiNamespace\n  - supported: true\n    type: AllNamespaces\n  maturity: alpha\n  links:\n  - name: Kubeflow\n    url: https://www.kubeflow.org/\n  provider:\n    name: Kubeflow\n  maintainers:\n    - name: Animesh Singh\n      email: singhan@us.ibm.com\n    - name: Tommy Li\n      email: tommy.chaoping.li@ibm.com\n    - name: Weiqiang Zhuang\n      email: wzhuang@us.ibm.com\n  keywords: \n    - Kubeflow\n    - Operator\n    - IBMCloud\n    - GCP\n    - OpenShift\n  version: 1.1.0\n  replaces: kubeflow.v1.0.0\n  selector:\n    matchLabels:\n      component: kubeflow-operator\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/1.2.0/kfdef.apps.kubeflow.org.crd.yaml",
    "content": "apiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: kfdefs.kfdef.apps.kubeflow.org\n  labels:\n    component: kubeflow-operator\nspec:\n  group: kfdef.apps.kubeflow.org\n  names:\n    kind: KfDef\n    listKind: KfDefList\n    plural: kfdefs\n    singular: kfdef\n  scope: Namespaced\n  subresources:\n    status: {}\n  validation:\n    openAPIV3Schema:\n      description: KfDef is the Schema for the kfdefs API\n      properties:\n        apiVersion:\n          description: 'APIVersion defines the versioned schema of this representation\n            of an object. Servers should convert recognized schemas to the latest\n            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'\n          type: string\n        kind:\n          description: 'Kind is a string value representing the REST resource this\n            object represents. Servers may infer this from the endpoint the client\n            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'\n          type: string\n        metadata:\n          type: object\n        spec:\n          description: KfDefSpec defines the desired state of KfDef\n          type: object\n        status:\n          description: KfDefStatus defines the observed state of KfDef\n          type: object\n      type: object\n  version: v1\n  versions:\n  - name: v1\n    served: true\n    storage: true\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/1.2.0/kubeflow.v1.2.0.clusterserviceversion.yaml",
    "content": "apiVersion: operators.coreos.com/v1alpha1\nkind: ClusterServiceVersion\nmetadata:\n  annotations:\n    alm-examples: >-\n      [\n      {\n        \"apiVersion\": \"kfdef.apps.kubeflow.org/v1\",\n        \"kind\": \"KfDef\",\n        \"metadata\": {\n            \"name\": \"kubeflow\",\n            \"namespace\": \"kubeflow\"\n        },\n        \"spec\": {\n            \"applications\": [\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/istio-1-3-1-stack\"\n                    }\n                  },\n                  \"name\": \"istio-stack\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cluster-local-gateway-1-3-1\"\n                    }\n                  },\n                  \"name\": \"cluster-local-gateway\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/istio\"\n                    }\n                  },\n                  \"name\": \"istio\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/add-anonymous-user-filter\"\n                    }\n                  },\n                  \"name\": \"add-anonymous-user-filter\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"application/v3\"\n                    }\n                  },\n                  \"name\": \"application\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/bootstrap\"\n                    }\n                  },\n                  \"name\": \"bootstrap\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cert-manager-crds\"\n                    }\n                  },\n                  \"name\": \"cert-manager-crds\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cert-manager-kube-system-resources\"\n                    }\n                  },\n                  \"name\": \"cert-manager-kube-system-resources\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/cert-manager\"\n                    }\n                  },\n                  \"name\": \"cert-manager\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm\"\n                    }\n                  },\n                  \"name\": \"kubeflow-apps\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"metacontroller/base\"\n                    }\n                  },\n                  \"name\": \"metacontroller\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/metadata\"\n                    }\n                  },\n                  \"name\": \"metadata\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/spark-operator\"\n                    }\n                  },\n                  \"name\": \"spark-operator\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"knative/installs/generic\"\n                    }\n                  },\n                  \"name\": \"knative\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"kfserving/installs/generic\"\n                    }\n                  },\n                  \"name\": \"kfserving\"\n              },\n              {\n                  \"kustomizeConfig\": {\n                    \"repoRef\": {\n                        \"name\": \"manifests\",\n                        \"path\": \"stacks/ibm/application/spartakus\"\n                    }\n                  },\n                  \"name\": \"spartakus\"\n              }\n            ],\n            \"repos\": [\n              {\n                  \"name\": \"manifests\",\n                  \"uri\": \"https://github.com/kubeflow/manifests/archive/v1.2.0.tar.gz\"\n              }\n            ],\n            \"version\": \"v1.2.0\"\n        }\n      }\n      ]\n    capabilities: Basic Install\n    categories: \"AI/Machine Learning\"\n    description: \"Kubeflow Operator for deployment and management of Kubeflow\"\n    support: Kubeflow\n    repository: https://github.com/kubeflow/kfctl\n    createdAt: '2020-03-19T00:00:00Z'\n    containerImage: aipipeline/kubeflow-operator:v1.2.0\n    certified: 'False'\n  name: kubeflow.v1.2.0\n  namespace: placeholder\nspec:\n  apiservicedefinitions: {}\n  customresourcedefinitions:\n    owned:\n    - description: KfDef is the Schema for the applications API\n      kind: KfDef\n      name: kfdefs.kfdef.apps.kubeflow.org\n      version: v1\n      displayName: Kubeflow\n      group: kfdef.apps.kubeflow.org\n  description: \"Kubeflow Operator for deployment and management of Kubeflow components. Applicable for Kubeflow versions 1.2.0 and above. Check [Kubeflow Operator documentation](https://github.com/kubeflow/kfctl/blob/master/operator.md) for more details.\"\n  displayName: Kubeflow\n  icon: \n  - base64data: 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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v/24IAEAAAAQND/1+0IVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AlHxsDwoTtjWwAAAABJRU5ErkJggg==\n    mediatype: image/png\n  install:\n    spec:\n      clusterPermissions:\n      - rules:\n        - apiGroups:\n          - '*'\n          resources:\n          - '*'\n          verbs:\n          - '*'\n        - nonResourceURLs:\n          - '*'\n          verbs:\n          - '*'\n        serviceAccountName: kubeflow-operator\n      deployments:\n      - name: kubeflow-operator\n        spec:\n          replicas: 1\n          selector:\n            matchLabels:\n              name: kubeflow-operator\n          strategy: {}\n          template:\n            metadata:\n              labels:\n                name: kubeflow-operator\n            spec:\n              containers:\n              - command:\n                - kfctl\n                env:\n                - name: WATCH_NAMESPACE\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.annotations['olm.targetNamespaces']\n                - name: POD_NAME\n                  valueFrom:\n                    fieldRef:\n                      fieldPath: metadata.name\n                - name: OPERATOR_NAME\n                  value: kubeflow-operator\n                image: aipipeline/kubeflow-operator:v1.2.0\n                imagePullPolicy: Always\n                name: kubeflow-operator\n                resources: {}\n              serviceAccountName: kubeflow-operator\n    strategy: deployment\n  installModes:\n  - supported: true\n    type: OwnNamespace\n  - supported: true\n    type: SingleNamespace\n  - supported: false\n    type: MultiNamespace\n  - supported: true\n    type: AllNamespaces\n  maturity: alpha\n  links:\n  - name: Kubeflow\n    url: https://www.kubeflow.org/\n  provider:\n    name: Kubeflow\n  maintainers:\n    - name: Animesh Singh\n      email: singhan@us.ibm.com\n    - name: Tommy Li\n      email: tommy.chaoping.li@ibm.com\n    - name: Weiqiang Zhuang\n      email: wzhuang@us.ibm.com\n    - name: Evan Hataishi\n      email: evan.hataishi@ibm.com\n  keywords: \n    - Kubeflow\n    - Operator\n    - IBMCloud\n    - GCP\n    - OpenShift\n  version: 1.2.0\n  replaces: kubeflow.v1.1.0\n  selector:\n    matchLabels:\n      component: kubeflow-operator\n"
  },
  {
    "path": "deploy/olm-catalog/kubeflow/kubeflow.package.yaml",
    "content": "channels:\n- currentCSV: kubeflow.v1.2.0\n  name: alpha\ndefaultChannel: alpha\npackageName: kubeflow\n"
  },
  {
    "path": "deploy/operator.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kubeflow-operator\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      name: kubeflow-operator\n  template:\n    metadata:\n      labels:\n        name: kubeflow-operator\n    spec:\n      serviceAccountName: kubeflow-operator\n      containers:\n        - name: kubeflow-operator\n          # Replace this with the built image name\n          image: aipipeline/kubeflow-operator:v1.2.0\n          command:\n          - kfctl\n          imagePullPolicy: Always\n          env:\n            - name: WATCH_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n            - name: OPERATOR_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n"
  },
  {
    "path": "deploy/params.yaml",
    "content": "varReference:\n- path: subjects/namespace\n  kind: ClusterRoleBinding\n  apiGroup: rbac.authorization.k8s.io/v1\n"
  },
  {
    "path": "deploy/role.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  annotations:\n    rbac.authorization.kubernetes.io/autoupdate: \"true\"\n  creationTimestamp: null\n  labels:\n    kubernetes.io/bootstrapping: rbac-defaults\n  name: kubeflow-operator\nrules:\n- apiGroups:\n  - '*'\n  resources:\n  - '*'\n  verbs:\n  - '*'\n- nonResourceURLs:\n  - '*'\n  verbs:\n  - '*'\n"
  },
  {
    "path": "deploy/service_account.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: kubeflow-operator\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/kubeflow/kfctl/v3\n\nrequire (\n\tcloud.google.com/go v0.57.0\n\tgithub.com/Azure/go-autorest v13.3.3+incompatible // indirect\n\tgithub.com/MakeNowJust/heredoc v1.0.0 // indirect\n\tgithub.com/Sirupsen/logrus v0.0.0-00010101000000-000000000000 // indirect\n\tgithub.com/aws/aws-sdk-go v1.27.1\n\tgithub.com/cenkalti/backoff v2.2.1+incompatible\n\tgithub.com/chai2010/gettext-go v0.0.0-20170215093142-bf70f2a70fb1 // indirect\n\tgithub.com/deckarep/golang-set v1.7.1\n\tgithub.com/docker/docker v1.13.1 // indirect\n\tgithub.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect\n\tgithub.com/elazarl/goproxy v0.0.0-20190711103511-473e67f1d7d2 // indirect\n\tgithub.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 // indirect\n\tgithub.com/fatih/color v1.7.0\n\tgithub.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32\n\tgithub.com/go-yaml/yaml v2.1.0+incompatible\n\tgithub.com/gogo/protobuf v1.3.1\n\tgithub.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e\n\tgithub.com/google/go-cmp v0.4.0\n\tgithub.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect\n\tgithub.com/hashicorp/go-getter v1.0.2\n\tgithub.com/hashicorp/go-version v1.2.0\n\tgithub.com/imdario/mergo v0.3.8\n\tgithub.com/jlewi/cloud-endpoints-controller v0.0.0-20200604211613-aff0aaad5602\n\tgithub.com/kubernetes-sigs/application v0.8.1\n\tgithub.com/onrik/logrus v0.5.1\n\tgithub.com/operator-framework/operator-sdk v0.13.0\n\tgithub.com/otiai10/copy v1.0.2\n\tgithub.com/pkg/errors v0.8.1\n\tgithub.com/prometheus/common v0.7.0\n\tgithub.com/sirupsen/logrus v1.6.0\n\tgithub.com/spf13/cobra v1.0.0\n\tgithub.com/spf13/pflag v1.0.5\n\tgithub.com/spf13/viper v1.4.0\n\tgithub.com/tektoncd/pipeline v0.10.1\n\tgithub.com/tidwall/gjson v1.6.0\n\tgithub.com/tidwall/pretty v1.0.1 // indirect\n\tgo.uber.org/zap v1.12.0 // indirect\n\tgolang.org/x/crypto v0.0.0\n\tgolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5\n\tgolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d\n\tgoogle.golang.org/api v0.25.0\n\tgoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84\n\tgopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect\n\tgopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect\n\tgopkg.in/yaml.v2 v2.2.8\n\tk8s.io/api v0.17.0\n\tk8s.io/apiextensions-apiserver v0.0.0\n\tk8s.io/apimachinery v0.17.1\n\tk8s.io/cli-runtime v0.0.0\n\tk8s.io/client-go v12.0.0+incompatible\n\tk8s.io/code-generator v0.18.1 // indirect\n\tk8s.io/kubernetes v1.16.2\n\tsigs.k8s.io/controller-runtime v0.4.0\n\tsigs.k8s.io/kustomize/kyaml v0.1.10 // indirect\n\tsigs.k8s.io/kustomize/v3 v3.2.0\n\tsigs.k8s.io/yaml v1.1.0\n)\n\nreplace (\n\tgit.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999\n\tgithub.com/Sirupsen/logrus => github.com/sirupsen/logrus v1.0.5\n\tgithub.com/go-openapi/jsonpointer => github.com/go-openapi/jsonpointer v0.17.0\n\tgithub.com/go-openapi/jsonreference => github.com/go-openapi/jsonreference v0.17.0\n\tgithub.com/go-openapi/spec => github.com/go-openapi/spec v0.18.0\n\tgithub.com/go-openapi/swag => github.com/go-openapi/swag v0.17.0\n\tgithub.com/mitchellh/go-homedir => github.com/mitchellh/go-homedir v1.0.0\n\tgithub.com/otiai10/copy => github.com/otiai10/copy v1.0.2\n\tgithub.com/otiai10/mint => github.com/otiai10/mint v1.3.0\n\tgithub.com/russross/blackfriday => github.com/russross/blackfriday v1.5.2-0.20180428102519-11635eb403ff // indirect\n\tgolang.org/x/crypto => golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9\n\tk8s.io/api => k8s.io/api v0.0.0-20190620084959-7cf5895f2711\n\tk8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.0.0-20190620085554-14e95df34f1f\n\tk8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719\n\tk8s.io/apiserver => k8s.io/apiserver v0.0.0-20190620085212-47dc9a115b18\n\tk8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20190620085706-2090e6d8f84c\n\tk8s.io/client-go => k8s.io/client-go v0.0.0-20190620085101-78d2af792bab\n\tk8s.io/cloud-provider => k8s.io/cloud-provider v0.0.0-20190620090043-8301c0bda1f0\n\tk8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.0.0-20190620090013-c9a0fc045dc1\n\tk8s.io/code-generator => k8s.io/code-generator v0.0.0-20190612205613-18da4a14b22b\n\tk8s.io/component-base => k8s.io/component-base v0.0.0-20190620085130-185d68e6e6ea\n\tk8s.io/cri-api => k8s.io/cri-api v0.0.0-20190531030430-6117653b35f1\n\tk8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.0.0-20190620090116-299a7b270edc\n\tk8s.io/kube-aggregator => k8s.io/kube-aggregator v0.0.0-20190620085325-f29e2b4a4f84\n\tk8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.0.0-20190620085942-b7f18460b210\n\tk8s.io/kube-proxy => k8s.io/kube-proxy v0.0.0-20190620085809-589f994ddf7f\n\tk8s.io/kube-scheduler => k8s.io/kube-scheduler v0.0.0-20190620085912-4acac5405ec6\n\tk8s.io/kubectl => k8s.io/kubectl v0.0.0-20191016120415-2ed914427d51\n\tk8s.io/kubelet => k8s.io/kubelet v0.0.0-20190620085838-f1cb295a73c9\n\tk8s.io/kubernetes => k8s.io/kubernetes v1.15.0\n\tk8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.0.0-20190620090156-2138f2c9de18\n\tk8s.io/metrics => k8s.io/metrics v0.0.0-20190620085625-3b22d835f165\n\tk8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20190620085408-1aef9010884e\n\tgithub.com/kubernetes-sigs/application => sigs.k8s.io/application v0.0.0-20190404151855-67ae7f915d4e\n\tsigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.2.0\n\tsigs.k8s.io/kustomize/v3 => sigs.k8s.io/kustomize/v3 v3.2.0\n)\n\ngo 1.13\n"
  },
  {
    "path": "go.sum",
    "content": "bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM=\ncloud.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.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=\ncloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=\ncloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=\ncloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=\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.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=\ncloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=\ncloud.google.com/go v0.47.0 h1:1JUtpcY9E7+eTospEwWS2QXP3DEn7poB3E2j0jN74mM=\ncloud.google.com/go v0.47.0/go.mod h1:5p3Ky/7f3N10VBkhuR5LFtddroTiMyjZV/Kj5qOQFxU=\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.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=\ncloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms=\ncloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=\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/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/logging v1.0.0/go.mod h1:V1cc3ogwobYzQq5f2R7DS/GvRIrI4FKj01Gs5glwAls=\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/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=\ncontrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA=\ncontrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg=\ncontrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A=\ncontrib.go.opencensus.io/exporter/stackdriver v0.12.8 h1:iXI5hr7pUwMx0IwMphpKz5Q3If/G5JiWFVZ5MPPxP9E=\ncontrib.go.opencensus.io/exporter/stackdriver v0.12.8/go.mod h1:XyyafDnFOsqoxHJgTFycKZMrRUrPThLh2iYTJF6uoO0=\ndmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=\ngithub.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE=\ngithub.com/Azure/azure-sdk-for-go v21.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=\ngithub.com/Azure/azure-sdk-for-go v28.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=\ngithub.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=\ngithub.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=\ngithub.com/Azure/go-autorest v11.1.2+incompatible h1:viZ3tV5l4gE2Sw0xrasFHytCGtzYCrT+um/rrSQ1BfA=\ngithub.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest v13.3.3+incompatible h1:oYzB8/Ldlo1Bq7By79KO/1nxWuoLnEoGQiToUM2rBZo=\ngithub.com/Azure/go-autorest v13.3.3+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg=\ngithub.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=\ngithub.com/Azure/go-autorest/autorest v0.9.3 h1:OZEIaBbMdUE/Js+BQKlpO81XlISgipr6yDJ+PSwsgi4=\ngithub.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0=\ngithub.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E=\ngithub.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=\ngithub.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=\ngithub.com/Azure/go-autorest/autorest/adal v0.8.1 h1:pZdL8o72rK+avFWl+p9nE8RWi1JInZrWJYlnpfXJwHk=\ngithub.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=\ngithub.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=\ngithub.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM=\ngithub.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=\ngithub.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=\ngithub.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=\ngithub.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc=\ngithub.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=\ngithub.com/Azure/go-autorest/autorest/to v0.1.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc=\ngithub.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=\ngithub.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8=\ngithub.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=\ngithub.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY=\ngithub.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=\ngithub.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88=\ngithub.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k=\ngithub.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=\ngithub.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=\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/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=\ngithub.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=\ngithub.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=\ngithub.com/GoogleCloudPlatform/cloud-builders/gcs-fetcher v0.0.0-20191203181535-308b93ad1f39/go.mod h1:yfGmCjKuUzk9WzubMlW2zwjhCraIc/J+M40cufdemRM=\ngithub.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20181220005116-f8e995905100/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14=\ngithub.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA=\ngithub.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=\ngithub.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=\ngithub.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=\ngithub.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=\ngithub.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=\ngithub.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=\ngithub.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=\ngithub.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=\ngithub.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=\ngithub.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=\ngithub.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=\ngithub.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=\ngithub.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=\ngithub.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=\ngithub.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=\ngithub.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg=\ngithub.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=\ngithub.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs=\ngithub.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=\ngithub.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=\ngithub.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=\ngithub.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E=\ngithub.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=\ngithub.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=\ngithub.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=\ngithub.com/ant31/crd-validation v0.0.0-20180702145049-30f8a35d0ac2/go.mod h1:X0noFIik9YqfhGYBLEHg8LJKEwy7QIitLQuFMpKLcPk=\ngithub.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=\ngithub.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=\ngithub.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=\ngithub.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=\ngithub.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM=\ngithub.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=\ngithub.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=\ngithub.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=\ngithub.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=\ngithub.com/aws/aws-sdk-go v1.27.1 h1:MXnqY6SlWySaZAqNnXThOvjRFdiiOuKtC6i7baFdNdU=\ngithub.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=\ngithub.com/bazelbuild/bazel-gazelle v0.0.0-20181012220611-c728ce9f663e/go.mod h1:uHBSeeATKpVazAACZBDPL/Nk/UhQDDsJWDlqYJo8/Us=\ngithub.com/bazelbuild/buildtools v0.0.0-20180226164855-80c7f0d45d7e/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=\ngithub.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=\ngithub.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=\ngithub.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=\ngithub.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=\ngithub.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=\ngithub.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=\ngithub.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0=\ngithub.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8=\ngithub.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=\ngithub.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=\ngithub.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY=\ngithub.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=\ngithub.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=\ngithub.com/chai2010/gettext-go v0.0.0-20170215093142-bf70f2a70fb1 h1:HD4PLRzjuCVW79mQ0/pdsalOLHJ+FaEoqJLxfltpb2U=\ngithub.com/chai2010/gettext-go v0.0.0-20170215093142-bf70f2a70fb1/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=\ngithub.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=\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.0.0-20170928000206-9ce5d979ffda/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudevents/sdk-go v0.0.0-20190509003705-56931988abe3/go.mod h1:j1nZWMLGg3om8SswStBoY6/SHvcLM19MuZqwDtMtmzs=\ngithub.com/cloudflare/cfssl v0.0.0-20180726162950-56268a613adf/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA=\ngithub.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=\ngithub.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk=\ngithub.com/codedellemc/goscaleio v0.0.0-20170830184815-20e2ce2cf885/go.mod h1:JIHmDHNZO4tmA3y3RHp6+Gap6kFsNf55W9Pn/3YS9IY=\ngithub.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0=\ngithub.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4=\ngithub.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=\ngithub.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=\ngithub.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=\ngithub.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=\ngithub.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=\ngithub.com/containernetworking/cni v0.6.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=\ngithub.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=\ngithub.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=\ngithub.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=\ngithub.com/coreos/go-oidc v0.0.0-20180117170138-065b426bd416/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=\ngithub.com/coreos/go-semver v0.0.0-20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=\ngithub.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=\ngithub.com/coreos/prometheus-operator v0.34.0 h1:TF9qaydNeUamLKs0hniaapa4FBz8U8TIlRRtJX987A4=\ngithub.com/coreos/prometheus-operator v0.34.0/go.mod h1:Li6rMllG/hYIyXfMuvUwhyC+hqwJVHdsDdP21hypT1M=\ngithub.com/coreos/rkt v1.30.0/go.mod h1:O634mlH6U7qk87poQifK6M2rsFNt+FyUTWNMnP1hF1U=\ngithub.com/cpuguy83/go-md2man v1.0.4/go.mod h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY=\ngithub.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=\ngithub.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=\ngithub.com/cyphar/filepath-securejoin v0.0.0-20170720062807-ae69057f2299/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=\ngithub.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8=\ngithub.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg=\ngithub.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc=\ngithub.com/cznic/internal v0.0.0-20180608152220-f44710a21d00/go.mod h1:olo7eAdKwJdXxb55TKGLiJ6xt1H0/tiiRCWKVLmtjY4=\ngithub.com/cznic/lldb v1.1.0/go.mod h1:FIZVUmYUVhPwRiPzL8nD/mpFcJ/G7SSXjjXYG4uRI3A=\ngithub.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=\ngithub.com/cznic/ql v1.2.0/go.mod h1:FbpzhyZrqr0PVlK6ury+PoW3T0ODUV22OeWIxcaOrSE=\ngithub.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=\ngithub.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=\ngithub.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc/go.mod h1:Y1SNZ4dRUOKXshKUbwUapqNncRrho4mkjQebgEHZLj8=\ngithub.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=\ngithub.com/d2g/dhcp4client v0.0.0-20170829104524-6e570ed0a266/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=\ngithub.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=\ngithub.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=\ngithub.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=\ngithub.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=\ngithub.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=\ngithub.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=\ngithub.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=\ngithub.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc=\ngithub.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=\ngithub.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=\ngithub.com/docker/distribution v0.0.0-20170726174610-edc3ab29cdff/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo=\ngithub.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=\ngithub.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=\ngithub.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=\ngithub.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=\ngithub.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=\ngithub.com/docker/libnetwork v0.0.0-20180830151422-a9cd636e3789/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8=\ngithub.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=\ngithub.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s=\ngithub.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=\ngithub.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=\ngithub.com/dustmop/soup v1.1.2-0.20190516214245-38228baa104e/go.mod h1:CgNC6SGbT+Xb8wGGvzilttZL1mc5sQ/5KkcxsZttMIk=\ngithub.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=\ngithub.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=\ngithub.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=\ngithub.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=\ngithub.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=\ngithub.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/elazarl/goproxy v0.0.0-20190711103511-473e67f1d7d2 h1:aZtFdDNWY/yH86JPR2WX/PN63635VsE/f/nXNPAbYxY=\ngithub.com/elazarl/goproxy v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=\ngithub.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM=\ngithub.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=\ngithub.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emicklei/go-restful v2.9.6+incompatible h1:tfrHha8zJ01ywiOEC1miGY8st1/igzWB8OmvPgoYX7w=\ngithub.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=\ngithub.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=\ngithub.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=\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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw=\ngithub.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=\ngithub.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=\ngithub.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM=\ngithub.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=\ngithub.com/fatih/camelcase v0.0.0-20160318181535-f6a740d52f96/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=\ngithub.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=\ngithub.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=\ngithub.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=\ngithub.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=\ngithub.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=\ngithub.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=\ngithub.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=\ngithub.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk=\ngithub.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=\ngithub.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew=\ngithub.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=\ngithub.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=\ngithub.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=\ngithub.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=\ngithub.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=\ngithub.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=\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/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg=\ngithub.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=\ngithub.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=\ngithub.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE=\ngithub.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=\ngithub.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=\ngithub.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=\ngithub.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=\ngithub.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=\ngithub.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=\ngithub.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=\ngithub.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=\ngithub.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=\ngithub.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=\ngithub.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=\ngithub.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=\ngithub.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=\ngithub.com/go-openapi/jsonreference v0.17.0 h1:yJW3HCkTHg7NOA+gZ83IPHzUSnUzGXhGmsdiCcMexbA=\ngithub.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=\ngithub.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=\ngithub.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=\ngithub.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=\ngithub.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=\ngithub.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=\ngithub.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk=\ngithub.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=\ngithub.com/go-openapi/runtime v0.17.2/go.mod h1:QO936ZXeisByFmZEO1IS1Dqhtf4QV1sYYFtIq6Ld86Q=\ngithub.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=\ngithub.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=\ngithub.com/go-openapi/spec v0.18.0 h1:aIjeyG5mo5/FrvDkpKKEGZPmF9MPHahS72mzfVqeQXQ=\ngithub.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=\ngithub.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=\ngithub.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=\ngithub.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=\ngithub.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=\ngithub.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=\ngithub.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=\ngithub.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=\ngithub.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=\ngithub.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=\ngithub.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=\ngithub.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=\ngithub.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU=\ngithub.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=\ngithub.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o=\ngithub.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=\ngithub.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ=\ngithub.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=\ngithub.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w=\ngithub.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=\ngithub.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs=\ngithub.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q=\ngithub.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk=\ngithub.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw=\ngithub.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=\ngithub.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=\ngithub.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=\ngithub.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=\ngithub.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=\ngithub.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34=\ngithub.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=\ngithub.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=\ngithub.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=\ngithub.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=\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 h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/mock v0.0.0-20160127222235-bd3c8e81be01/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\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.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=\ngithub.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=\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.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 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450 h1:7xqw01UYS+KCI25bMrPxwNYkSns2Db1ziQPpVq99FpE=\ngithub.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho=\ngithub.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995 h1:f5gsjBiF9tRRVomCvrkGMMWI8W1f2OBFar2c5oakAP0=\ngithub.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8=\ngithub.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e h1:KhcknUwkWHKZPbFy2P7jH5LKJ3La+0ZeknkkmrSgqb0=\ngithub.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=\ngithub.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=\ngithub.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=\ngithub.com/google/cadvisor v0.33.2-0.20190411163913-9db8c7dee20a/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48=\ngithub.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-containerregistry v0.0.0-20200115214256-379933c9c22b/go.mod h1:Wtl/v6YdQxv397EREtzwgd9+Ud7Q5D8XMbi3Zazgkrs=\ngithub.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=\ngithub.com/google/go-licenses v0.0.0-20191112164736-212ea350c932/go.mod h1:16wa6pRqNDUIhOtwF0GcROVqMeXHZJ7H6eGDFUh5Pfk=\ngithub.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=\ngithub.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=\ngithub.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=\ngithub.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/licenseclassifier v0.0.0-20190926221455-842c0d70d702/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M=\ngithub.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=\ngithub.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=\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-20190723021845-34ac40c74b70/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=\ngithub.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.1.0 h1:Jf4mxPC/ziBnoPIdpQdPJ9OeiomAUHLvxmPRSPH9m4s=\ngithub.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww=\ngithub.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=\ngithub.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=\ngithub.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=\ngithub.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=\ngithub.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=\ngithub.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=\ngithub.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=\ngithub.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=\ngithub.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0=\ngithub.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=\ngithub.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk=\ngithub.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=\ngithub.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8 h1:L9JPKrtsHMQ4VCRQfHvbbHBfB2Urn8xf6QZeXZ+OrN4=\ngithub.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4=\ngithub.com/gophercloud/gophercloud v0.2.0 h1:lD2Bce2xBAMNNcFZ0dObTpXkGLlVIb33RPVUNVpw6ic=\ngithub.com/gophercloud/gophercloud v0.2.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=\ngithub.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\ngithub.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=\ngithub.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=\ngithub.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=\ngithub.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=\ngithub.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=\ngithub.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=\ngithub.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=\ngithub.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=\ngithub.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=\ngithub.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20170330212424-2500245aa611/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=\ngithub.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=\ngithub.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=\ngithub.com/grpc-ecosystem/grpc-health-probe v0.2.1-0.20181220223928-2bf0a5b182db/go.mod h1:uBKkC2RbarFsvS5jMJHpVhTLvGlGQj9JJwkaePE3FWI=\ngithub.com/h2non/gock v1.0.9/go.mod h1:CZMcB0Lg5IWnr9bF79pPMg9WeV6WumxQiUJ1UvdO1iE=\ngithub.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=\ngithub.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig=\ngithub.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=\ngithub.com/hashicorp/go-getter v1.0.2 h1:ba+UwCRuxJ7+rS+cO6JnQZUrweQjmEAkwKu9r7+HCpM=\ngithub.com/hashicorp/go-getter v1.0.2/go.mod h1:q+PoBhh16brIKwJS9kt18jEtXHTg2EGkmrA9P7HVS+U=\ngithub.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=\ngithub.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=\ngithub.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=\ngithub.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0=\ngithub.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E=\ngithub.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=\ngithub.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=\ngithub.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=\ngithub.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/hcl v0.0.0-20160711231752-d8c773c4cba1/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=\ngithub.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/heketi/heketi v0.0.0-20181109135656-558b29266ce0/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o=\ngithub.com/heketi/rest v0.0.0-20180404230133-aa6a65207413/go.mod h1:BeS3M108VzVlmAue3lv2WcGuPAX94/KN63MUURzbYSI=\ngithub.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4=\ngithub.com/heketi/utils v0.0.0-20170317161834-435bc5bdfa64/go.mod h1:RYlF4ghFZPPmk2TC5REt5OFwvfb6lzxFWrTWB+qs28s=\ngithub.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4=\ngithub.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=\ngithub.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=\ngithub.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=\ngithub.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=\ngithub.com/improbable-eng/thanos v0.3.2/go.mod h1:GZewVGILKuJVPNRn7L4Zw+7X96qzFOwj63b22xYGXBE=\ngithub.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=\ngithub.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=\ngithub.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=\ngithub.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=\ngithub.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=\ngithub.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=\ngithub.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=\ngithub.com/jenkins-x/go-scm v1.5.65/go.mod h1:MgGRkJScE/rJ30J/bXYqduN5sDPZqZFITJopsnZmTOw=\ngithub.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=\ngithub.com/jlewi/cloud-endpoints-controller v0.0.0-20200604211613-aff0aaad5602 h1:qW4JMBhHsZmvD+YBdnqZZX/T9Jfy3ZXDZBMU112vK/8=\ngithub.com/jlewi/cloud-endpoints-controller v0.0.0-20200604211613-aff0aaad5602/go.mod h1:Ny/iFXrdxEFMbbtX5W2xoxmOmug03FX+6Z4G2/0HKuY=\ngithub.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=\ngithub.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=\ngithub.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=\ngithub.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=\ngithub.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=\ngithub.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=\ngithub.com/jonboulle/clockwork v0.0.0-20141017032234-72f9bd7c4e0c/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=\ngithub.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=\ngithub.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo=\ngithub.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=\ngithub.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/jsonnet-bundler/jsonnet-bundler v0.1.0/go.mod h1:YKsSFc9VFhhLITkJS3X2PrRqWG9u2Jq99udTdDjQLfM=\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/jteeuwen/go-bindata v0.0.0-20151023091102-a0ff2567cfb7/go.mod h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs=\ngithub.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/kardianos/osext v0.0.0-20150410034420-8fef92e41e22/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=\ngithub.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=\ngithub.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34=\ngithub.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=\ngithub.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=\ngithub.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=\ngithub.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=\ngithub.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/fs v0.0.0-20131111012553-2788f0dbd169/go.mod h1:glhvuHOU9Hy7/8PwwdtnarXqLagOX0b/TbZx2zLMqEg=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.0.0-20140812000539-f31442d60e51/go.mod h1:Bvhd+E3laJ0AVkG0c9rmtZcnhV0HQ3+c3YxxqTvc/gA=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\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/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=\ngithub.com/kr/text v0.0.0-20130911015532-6807e777504f/go.mod h1:sjUstKUATFIcff4qlB53Kml0wQPtJVc/3fWrmuUmcfA=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE=\ngithub.com/kubernetes-sigs/application v0.8.0 h1:NNp+kJrX4P7LkQhN/WZ4mGSTiRs5BBsDkReU1Fz/Kck=\ngithub.com/kubernetes-sigs/application v0.8.0/go.mod h1:KqAScqo78PXUrmoFOH8z6P4xQDBdzyJH1FMqrhgJJLE=\ngithub.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=\ngithub.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/libopenstorage/openstorage v0.0.0-20170906232338-093a0c388875/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc=\ngithub.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=\ngithub.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=\ngithub.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA=\ngithub.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=\ngithub.com/magiconair/properties v0.0.0-20160816085511-61b492c03cf4/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=\ngithub.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=\ngithub.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.0.0-20190620125010-da37f6c1e481 h1:IaSjLMT6WvkoZZjspGxy3rdaTEmWLoRm49WbtVUi9sA=\ngithub.com/mailru/easyjson v0.0.0-20190620125010-da37f6c1e481/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=\ngithub.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=\ngithub.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=\ngithub.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs=\ngithub.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=\ngithub.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=\ngithub.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a h1:+J2gw7Bw77w/fbK7wnNJJDKmw1IbWft2Ul5BzrG1Qm8=\ngithub.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0=\ngithub.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=\ngithub.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=\ngithub.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=\ngithub.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=\ngithub.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=\ngithub.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=\ngithub.com/mattn/go-shellwords v0.0.0-20180605041737-f8471b0a71de/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=\ngithub.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=\ngithub.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/maxbrunsfeld/counterfeiter/v6 v6.2.1/go.mod h1:F9YacGpnZbLQMzuPI0rR6op21YvNu/RjL705LJJpM3k=\ngithub.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=\ngithub.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4=\ngithub.com/mholt/caddy v0.0.0-20180213163048-2de495001514/go.mod h1:Wb1PlT4DAYSqOEd03MsqkdkXnTxA8v9pKjdpxbqM1kY=\ngithub.com/miekg/dns v0.0.0-20160614162101-5d001d020961/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=\ngithub.com/mindprince/gonvml v0.0.0-20171110221305-fee913ce8fb2/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY=\ngithub.com/mistifyio/go-zfs v0.0.0-20151009155749-1b4ae6fb4e77/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=\ngithub.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=\ngithub.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0=\ngithub.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=\ngithub.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=\ngithub.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=\ngithub.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=\ngithub.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=\ngithub.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=\ngithub.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=\ngithub.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=\ngithub.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=\ngithub.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=\ngithub.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=\ngithub.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=\ngithub.com/mrunalp/fileutils v0.0.0-20160930181131-4ee1cc9a8058/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0=\ngithub.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/munnerz/goautoneg v0.0.0-20190414153302-2ae31c8b6b30/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mvdan/xurls v0.0.0-20160110113200-1b768d7c393a/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=\ngithub.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA=\ngithub.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=\ngithub.com/nats-io/gnatsd v1.4.1/go.mod h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ=\ngithub.com/nats-io/go-nats v1.7.0/go.mod h1:+t7RHT5ApZebkrQdnn6AhQJmhJJiKAvJUio1PiiCtj0=\ngithub.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4=\ngithub.com/nats-io/nuid v1.0.0/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=\ngithub.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=\ngithub.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/onrik/logrus v0.2.1 h1:xEYR+opLvr+hNixPPAimuQppFYHaZ0XLO9hZ2G8WPLI=\ngithub.com/onrik/logrus v0.2.1/go.mod h1:qfe9NeZVAJfIxviw3cYkZo3kvBtLoPRJriAO8zl7qTk=\ngithub.com/onrik/logrus v0.5.1 h1:f+dStGd/hIk6qUb8CUESjczzd4MrdeGHuOLoJ5msr44=\ngithub.com/onrik/logrus v0.5.1/go.mod h1:qfe9NeZVAJfIxviw3cYkZo3kvBtLoPRJriAO8zl7qTk=\ngithub.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=\ngithub.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=\ngithub.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=\ngithub.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=\ngithub.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=\ngithub.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=\ngithub.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=\ngithub.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=\ngithub.com/opencontainers/image-spec v0.0.0-20170604055404-372ad780f634/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=\ngithub.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=\ngithub.com/opencontainers/runc v0.0.0-20181113202123-f000fe11ece1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=\ngithub.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=\ngithub.com/opencontainers/selinux v0.0.0-20170621221121-4a2974bf1ee9/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=\ngithub.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY=\ngithub.com/openshift/client-go v0.0.0-20190923180330-3b6373338c9b/go.mod h1:6rzn+JTr7+WYS2E1TExP4gByoABxMznR6y2SnUIkmxk=\ngithub.com/openshift/origin v0.0.0-20160503220234-8f127d736703/go.mod h1:0Rox5r9C8aQn6j1oAOQ0c1uC86mYbUFObzjBRvUKHII=\ngithub.com/openshift/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw=\ngithub.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=\ngithub.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=\ngithub.com/openzipkin/zipkin-go v0.2.0/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=\ngithub.com/operator-framework/operator-lifecycle-manager v0.0.0-20191115003340-16619cd27fa5/go.mod h1:zL34MNy92LPutBH5gQK+gGhtgTUlZZX03I2G12vWHF4=\ngithub.com/operator-framework/operator-registry v1.5.1/go.mod h1:agrQlkWOo1q8U1SAaLSS2WQ+Z9vswNT2M2HFib9iuLY=\ngithub.com/operator-framework/operator-sdk v0.13.0 h1:AWiKOl6ZeAyQgbGVoD8fNd+eCbFuRWgr4hciaaOEBmE=\ngithub.com/operator-framework/operator-sdk v0.13.0/go.mod h1:XRnicDD4uZCNbJbMXc0B7eyw7hjO4Xzol7FAkWHa1Nc=\ngithub.com/otiai10/copy v1.0.1/go.mod h1:8bMCJrAqOtN/d9oyh5HR7HhLQMvcGMpGdwRDYsfOCHc=\ngithub.com/otiai10/copy v1.0.2 h1:DDNipYy6RkIkjMwy+AWzgKiNTyj2RUI9yEMeETEpVyc=\ngithub.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY=\ngithub.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=\ngithub.com/otiai10/curr v0.0.0-20190513014714-f5a3d24e5776 h1:o59bHXu8Ejas8Kq6pjoVJQ9/neN66SM8AKh6wI42BBs=\ngithub.com/otiai10/curr v0.0.0-20190513014714-f5a3d24e5776/go.mod h1:3HNVkVOU7vZeFXocWuvtcS0XSFLcf2XUSDHkq9t1jU4=\ngithub.com/otiai10/mint v1.2.3/go.mod h1:YnfyPNhBvnY8bW4SGQHCs/aAFhkgySlMZbrF5U0bOVw=\ngithub.com/otiai10/mint v1.2.4/go.mod h1:d+b7n/0R3tdyUYYylALXpWQ/kTN+QobSq/4SRGBkR3M=\ngithub.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc=\ngithub.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=\ngithub.com/paulmach/orb v0.1.3/go.mod h1:VFlX/8C+IQ1p6FTRRKzKoOPJnvEtA5G0Veuqwbu//Vk=\ngithub.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=\ngithub.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=\ngithub.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=\ngithub.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=\ngithub.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=\ngithub.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=\ngithub.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=\ngithub.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=\ngithub.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=\ngithub.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=\ngithub.com/pkg/sftp v0.0.0-20160930220758-4d0e916071f6/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk=\ngithub.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=\ngithub.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=\ngithub.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=\ngithub.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=\ngithub.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8=\ngithub.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=\ngithub.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=\ngithub.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=\ngithub.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY=\ngithub.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=\ngithub.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=\ngithub.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=\ngithub.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=\ngithub.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=\ngithub.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s=\ngithub.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=\ngithub.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g=\ngithub.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d/go.mod h1:7DPO4domFU579Ga6E61sB9VFNaniPVwJP5C4bBCu3wA=\ngithub.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI=\ngithub.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=\ngithub.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=\ngithub.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=\ngithub.com/robfig/cron v0.0.0-20170309132418-df38d32658d8/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=\ngithub.com/robfig/cron v0.0.0-20170526150127-736158dc09e1/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=\ngithub.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=\ngithub.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=\ngithub.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=\ngithub.com/rogpeppe/go-internal v1.5.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=\ngithub.com/rubenv/sql-migrate v0.0.0-20191025130928-9355dd04f4b3/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY=\ngithub.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=\ngithub.com/russross/blackfriday v1.5.2-0.20180428102519-11635eb403ff h1:bxenFOpdnKzbA1dhcJpgiwjSw7yqvWWY6huCpmsBfv0=\ngithub.com/russross/blackfriday v1.5.2-0.20180428102519-11635eb403ff/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=\ngithub.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=\ngithub.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=\ngithub.com/seccomp/libseccomp-golang v0.0.0-20150813023252-1b506fc7c24e/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=\ngithub.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=\ngithub.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=\ngithub.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=\ngithub.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=\ngithub.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo=\ngithub.com/shurcooL/githubv4 v0.0.0-20191102174205-af46314aec7b/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo=\ngithub.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg=\ngithub.com/shurcooL/sanitized_anchor_name v0.0.0-20151028001915-10ef21a441db/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=\ngithub.com/sigma/go-inotify v0.0.0-20181102212354-c87b6cf5033d/go.mod h1:stlh9OsqBQSdwxTxX73mu41BBtRbIpZLQ7flcAoxAfo=\ngithub.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I=\ngithub.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=\ngithub.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=\ngithub.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\ngithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=\ngithub.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=\ngithub.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=\ngithub.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=\ngithub.com/spf13/afero v0.0.0-20160816080757-b28a7effac97/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=\ngithub.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=\ngithub.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=\ngithub.com/spf13/cast v0.0.0-20160730092037-e31f36ffc91a/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=\ngithub.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=\ngithub.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=\ngithub.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=\ngithub.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=\ngithub.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=\ngithub.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=\ngithub.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=\ngithub.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=\ngithub.com/spf13/jwalterweatherman v0.0.0-20160311093646-33c24e77fb80/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=\ngithub.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=\ngithub.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=\ngithub.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=\ngithub.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v0.0.0-20160820190039-7fb2782df3d8/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=\ngithub.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=\ngithub.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=\ngithub.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=\ngithub.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=\ngithub.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY=\ngithub.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=\ngithub.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=\ngithub.com/technosophos/moniker v0.0.0-20180509230615-a5dbd03a2245/go.mod h1:O1c8HleITsZqzNZDjSNzirUGsMT0oGu9LhHKoJrqO+A=\ngithub.com/tektoncd/pipeline v0.10.1 h1:pDsYK2b70o/Ze/CE1nisELwKVVE54FxwyfLznsW1JiE=\ngithub.com/tektoncd/pipeline v0.10.1/go.mod h1:D2X0exT46zYx95BU7ByM8+erpjoN7thmUBvlKThOszU=\ngithub.com/tektoncd/plumbing v0.0.0-20191216083742-847dcf196de9/go.mod h1:QZHgU07PRBTRF6N57w4+ApRu8OgfYLFNqCDlfEZaD9Y=\ngithub.com/tektoncd/plumbing/pipelinerun-logs v0.0.0-20191206114338-712d544c2c21/go.mod h1:S62EUWtqmejjJgUMOGB1CCCHRp6C706laH06BoALkzU=\ngithub.com/tidwall/gjson v1.4.0 h1:w6iOJZt9BJOzz4VD9CSnRCX/oleCsAZWi+1FFzZA+SA=\ngithub.com/tidwall/gjson v1.4.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=\ngithub.com/tidwall/gjson v1.6.0 h1:9VEQWz6LLMUsUl6PueE49ir4Ka6CzLymOAZDxpFsTDc=\ngithub.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=\ngithub.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=\ngithub.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=\ngithub.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=\ngithub.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=\ngithub.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=\ngithub.com/tidwall/pretty v1.0.1 h1:WE4RBSZ1x6McVVC8S/Md+Qse8YUv6HRObAx6ke00NY8=\ngithub.com/tidwall/pretty v1.0.1/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=\ngithub.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=\ngithub.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=\ngithub.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok=\ngithub.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=\ngithub.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=\ngithub.com/vdemeester/k8s-pkg-credentialprovider v0.0.0-20200107171650-7c61ffa44238/go.mod h1:JwQJCMWpUDqjZrB5jpw0f5VbN7U95zxFy1ZDpoEarGo=\ngithub.com/vdemeester/k8s-pkg-credentialprovider v1.13.12-1/go.mod h1:Fko0rTxEtDW2kju5Ky7yFJNS3IcNvW8IPsp4/e9oev0=\ngithub.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=\ngithub.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=\ngithub.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=\ngithub.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU=\ngithub.com/vmware/photon-controller-go-sdk v0.0.0-20170310013346-4a435daef6cc/go.mod h1:e6humHha1ekIwTCm+A5Qed5mG8V4JL+ChHcUOJ+L/8U=\ngithub.com/xanzy/go-cloudstack v0.0.0-20160728180336-1e2cbf647e57/go.mod h1:s3eL3z5pNXF5FVybcT+LIVdId8pYn709yv6v5mrkrQE=\ngithub.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs=\ngithub.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=\ngithub.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=\ngithub.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=\ngithub.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=\ngithub.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8=\ngithub.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI=\ngithub.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=\ngithub.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=\ngithub.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=\ngitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=\ngo.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=\ngo.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=\ngo.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=\ngo.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=\ngo.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=\ngo.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=\ngo.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=\ngo.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=\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.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50=\ngo.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=\ngo.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=\ngo.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=\ngo.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg=\ngo.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=\ngo.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=\ngo.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=\ngo.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc=\ngo.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=\ngo.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=\ngo.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=\ngo.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.12.0 h1:dySoUQPFBGj6xwjmBzageVL8jGi8uxc6bEmJQjA06bw=\ngo.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=\ngolang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9 h1:mKdxBk7AujPs8kU4m80U72y/zjbZ3UcXC7dClwKbUI0=\ngolang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=\ngolang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=\ngolang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=\ngolang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=\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-20181217174547-8f45f776aaf1/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 h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=\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 h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=\ngolang.org/x/lint v0.0.0-20200302205851-738671d3881b/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/mobile v0.0.0-20190806162312-597adff16ade/go.mod h1:AlhUtkH4DA4asiFC5RgK7ZKmauvtkAVcy9L0epCzlWo=\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/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190206173232-65e2d4e15006/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\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-20190812203447-cdfb69ac37fc h1:gkKoSkUmnU6bpS/VhkuO27bzQeSA51uaEfbOW5dNb68=\ngolang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20191119073136-fc4aabc6c914 h1:MlY3mEfbnWGmUi4rtHOtNnnnN4UJRGSyLPx+DXA5Sq4=\ngolang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/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 h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/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 h1:WQ8q63x+f/zpC8Ac1s9wLElVoHhm32p6tudrU72n1QA=\ngolang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/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-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\ngolang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=\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 h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=\ngolang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\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 h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=\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/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181004145325-8469e314837c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181213200352-4d1cda033e06/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190219203350-90b0e4468f99/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190426135247-a129542de9ae/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-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190621203818-d432491b9138/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0=\ngolang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191210023423-ac6580df4449 h1:gSbV7h1NRL2G1xTg/owz62CST1oJBmxy4QpMMregXVQ=\ngolang.org/x/sys v0.0.0-20191210023423-ac6580df4449/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-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 h1:hq86ru83GdWTlfQFZGO4nZJTU4Bs2wfHl8oFHRaXsfc=\ngolang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\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.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=\ngolang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=\ngolang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=\ngolang.org/x/tools v0.0.0-20170824195420-5d2fd3ccab98/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/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-20190617190820-da514acc4774/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-20190624180213-70d37148ca0c/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-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=\ngolang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=\ngolang.org/x/tools v0.0.0-20190807223507-b346f7fd45de/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\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-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191010171213-8abd42400456/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-20191018212557-ed542cd5b28a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=\ngolang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191112005509-a3f652f18032/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-20200115165105-de0b1760071a h1:bEJ3JL2YUH3tt9KX9dsy0WUF3WOrhjtNjK93o0svepY=\ngolang.org/x/tools v0.0.0-20200115165105-de0b1760071a/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-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d h1:lzLdP95xJmMpwQ6LUHwrc5V7js93hTiY7gkznu0BgmY=\ngolang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0=\ngomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=\ngonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=\ngonum.org/v1/gonum v0.0.0-20190710053202-4340aa3071a0/go.mod h1:03dgh78c4UvU1WksguQ/lvJQXbezKQGJSrwwRq5MraQ=\ngonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=\ngonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=\ngoogle.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=\ngoogle.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=\ngoogle.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=\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.10.0 h1:7tmAxx3oKE98VMZ+SBZzvYYWRQ9HODBxmC8mXUsraSQ=\ngoogle.golang.org/api v0.10.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.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.25.0 h1:LodzhlzZEUfhXzNUMIfVlf9Gr6Ua5MMtoFWh7+f47qA=\ngoogle.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=\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.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=\ngoogle.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=\ngoogle.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=\ngoogle.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=\ngoogle.golang.org/genproto v0.0.0-20170731182057-09f6ed296fc6/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\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-20190404172233-64821d5d2107/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-20190708153700-3bdd9d9f5532/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=\ngoogle.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=\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-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8=\ngoogle.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=\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-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84 h1:pSLkPbrjnPyLDYUO2VM9mDLqo2V6CFBY84lFSZAfoi4=\ngoogle.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=\ngoogle.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=\ngoogle.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=\ngoogle.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=\ngoogle.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=\ngoogle.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=\ngoogle.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=\ngoogle.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=\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 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=\ngoogle.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=\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 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo=\ngopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=\ngopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0=\ngopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=\ngopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw=\ngopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=\ngopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=\ngopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=\ngopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=\ngopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=\ngopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=\ngopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0-20150622162204-20b71e5b60d7 h1:986b60BAz5vO2Vaf48yQaq+wb2bU4JsXxKu1+itW6x8=\ngopkg.in/natefinch/lumberjack.v2 v2.0.0-20150622162204-20b71e5b60d7/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=\ngopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=\ngopkg.in/square/go-jose.v2 v2.0.0-20180411045311-89060dee6a84/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=\ngopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98=\ngopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g=\ngopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=\ngopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=\ngopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=\ngopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=\ngopkg.in/yaml.v2 v2.1.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=\ngopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 h1:XZx7nhd5GMaZpmDaEHFVafUZC7ya0fuo7cSJ3UCKYmM=\ngopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=\ngotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=\nhonnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\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.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nhonnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=\nhonnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=\nk8s.io/api v0.0.0-20190620084959-7cf5895f2711 h1:BblVYz/wE5WtBsD/Gvu54KyBUTJMflolzc5I2DTvh50=\nk8s.io/api v0.0.0-20190620084959-7cf5895f2711/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A=\nk8s.io/apiextensions-apiserver v0.0.0-20190620085554-14e95df34f1f h1:+pHBUvIpLzm6H8VwRO+jMLcq5MIfaGq5xu/cBV676Ps=\nk8s.io/apiextensions-apiserver v0.0.0-20190620085554-14e95df34f1f/go.mod h1:++XMkbLSSAutLgulnUnXW4kNbSkyQzlPL8PaW4hjJT4=\nk8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719 h1:uV4S5IB5g4Nvi+TBVNf3e9L4wrirlwYJ6w88jUQxTUw=\nk8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719/go.mod h1:I4A+glKBHiTgiEjQiCCQfCAIcIMFGt291SmsvcrFzJA=\nk8s.io/apiserver v0.0.0-20190620085212-47dc9a115b18/go.mod h1:Hc9PbFVOsMigd7B7OiY/6bIRkR8y31eIKsr1D+JtKg4=\nk8s.io/autoscaler v0.0.0-20190607113959-1b4f1855cb8e/go.mod h1:QEXezc9uKPT91dwqhSJq3GNI3B1HxFRQHiku9kmrsSA=\nk8s.io/cli-runtime v0.0.0-20190620085706-2090e6d8f84c h1:w9/2LqD258mHJmpbLczVn5bnsK6ppTqlA64NTsjXZMY=\nk8s.io/cli-runtime v0.0.0-20190620085706-2090e6d8f84c/go.mod h1:fkxp0BXLu9gu3r8x8X8gLrfDgWfqusKEJUnMUIqpDcg=\nk8s.io/client-go v0.0.0-20190620085101-78d2af792bab h1:E8Fecph0qbNsAbijJJQryKu4Oi9QTp5cVpjTE+nqg6g=\nk8s.io/client-go v0.0.0-20190620085101-78d2af792bab/go.mod h1:E95RaSlHr79aHaX0aGSwcPNfygDiPKOVXdmivCIZT0k=\nk8s.io/cloud-provider v0.0.0-20190620090043-8301c0bda1f0/go.mod h1:UXU55LeVTrjyQNw86sHjagiYhSZjYxWKXvx0Ml17KvM=\nk8s.io/cluster-bootstrap v0.0.0-20190620090013-c9a0fc045dc1/go.mod h1:cCRw3eZzlJdySYRtkL/N4cAClxYCzyrBL3V8cblTlUo=\nk8s.io/code-generator v0.0.0-20190612205613-18da4a14b22b h1:p+PRuwXWwk5e+UYvicGiavEupapqM5NOxUl3y1GkD6c=\nk8s.io/code-generator v0.0.0-20190612205613-18da4a14b22b/go.mod h1:G8bQwmHm2eafm5bgtX67XDZQ8CWKSGu9DekI+yN4Y5I=\nk8s.io/component-base v0.0.0-20190620085130-185d68e6e6ea/go.mod h1:VLedAFwENz2swOjm0zmUXpAP2mV55c49xgaOzPBI/QQ=\nk8s.io/cri-api v0.0.0-20190531030430-6117653b35f1/go.mod h1:K6Ux7uDbzKhacgqW0OJg3rjXk/SR9kprCPfSUDXGB5A=\nk8s.io/csi-translation-lib v0.0.0-20190620090116-299a7b270edc/go.mod h1:L51Xd2IwQCsOBx41c4YZR9dY1h1IjMk8r3Nnv3L80KM=\nk8s.io/gengo v0.0.0-20190116091435-f8a0810f38af/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=\nk8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=\nk8s.io/gengo v0.0.0-20191010091904-7fa3014cb28f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=\nk8s.io/gengo v0.0.0-20191108084044-e500ee069b5c h1:iraFntD6FA5K/hBaPW2z/ZItJZEG63uc3ak5S0oDVEo=\nk8s.io/gengo v0.0.0-20191108084044-e500ee069b5c/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=\nk8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM=\nk8s.io/helm v2.16.1+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI=\nk8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=\nk8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=\nk8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=\nk8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=\nk8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=\nk8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=\nk8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=\nk8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok=\nk8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=\nk8s.io/kube-aggregator v0.0.0-20190620085325-f29e2b4a4f84/go.mod h1:S8URgD5o6oGCoLP9lx6oAdxWB9Ovtq9KLU9cYmU08QI=\nk8s.io/kube-controller-manager v0.0.0-20190620085942-b7f18460b210/go.mod h1:FoQCodL0eAmdwbZuu2/fi7nVEh3xE4SpomwLaGO4V74=\nk8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=\nk8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=\nk8s.io/kube-openapi v0.0.0-20190320154901-5e45bb682580/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=\nk8s.io/kube-openapi v0.0.0-20190603182131-db7b694dc208/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4=\nk8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=\nk8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d h1:Xpe6sK+RY4ZgCTyZ3y273UmFmURhjtoJiwOMbQsXitY=\nk8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=\nk8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU=\nk8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=\nk8s.io/kube-proxy v0.0.0-20190620085809-589f994ddf7f/go.mod h1:EP2frUhhC4rizGpCTYCnVS4+XZMh7Hyq40jOUvuAK5g=\nk8s.io/kube-scheduler v0.0.0-20190620085912-4acac5405ec6/go.mod h1:ktfBNqjRdtYUw2eFNk32TtxiGqOy00eiWua74iNEcLg=\nk8s.io/kube-state-metrics v1.7.2 h1:6vdtgXrrRRMSgnyDmgua+qvgCYv954JNfxXAtDkeLVQ=\nk8s.io/kube-state-metrics v1.7.2/go.mod h1:U2Y6DRi07sS85rmVPmBFlmv+2peBcL8IWGjM+IjYA/E=\nk8s.io/kubectl v0.0.0-20191016120415-2ed914427d51/go.mod h1:gL826ZTIfD4vXTGlmzgTbliCAT9NGiqpCqK2aNYv5MQ=\nk8s.io/kubelet v0.0.0-20190620085838-f1cb295a73c9/go.mod h1:2gRsvblRTyHIsBazBlnqeAWkWRtnUq6cBnrfdPFr9iY=\nk8s.io/kubernetes v1.15.0 h1:0P6jAdZ1cF5/wSc14HqHCjWlbnwYzmFJBYeXBezZEE0=\nk8s.io/kubernetes v1.15.0/go.mod h1:3RE5ikMc73WK+dSxk4pQuQ6ZaJcPXiZX2dj98RcdCuM=\nk8s.io/legacy-cloud-providers v0.0.0-20190620090156-2138f2c9de18/go.mod h1:cgNZX1LyZbr0mW8MxxlgvFU2D3k1KDTlH/EgMuiQbGc=\nk8s.io/metrics v0.0.0-20190620085625-3b22d835f165/go.mod h1:98M2pmJXrzr0W4o9N5ptSvZMygAMRVvyPr2vq7aRwT4=\nk8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3/go.mod h1:+G1xBfZDfVFsm1Tj/HNCvg4QqWx8rJ2Fxpqr1rqp/gQ=\nk8s.io/sample-apiserver v0.0.0-20190620085408-1aef9010884e/go.mod h1:uGtJFD6/KTth+Ed9NNWF8lMf5m1ued/X6qUuACRrBTs=\nk8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0=\nk8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0=\nk8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=\nk8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=\nk8s.io/utils v0.0.0-20191030222137-2b95a09bc58d h1:1P0iBJsBzxRmR+dIFnM+Iu4aLxnoa7lBqozW/0uHbT8=\nk8s.io/utils v0.0.0-20191030222137-2b95a09bc58d/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=\nk8s.io/utils v0.0.0-20200529193333-24a76e807f40 h1:4kgN8/a1iSnX2Trptc8nnoXnOGXkrcaF0u4+dmiCRRA=\nk8s.io/utils v0.0.0-20200529193333-24a76e807f40/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=\nknative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=\nknative.dev/eventing-contrib v0.6.1-0.20190723221543-5ce18048c08b/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=\nknative.dev/pkg v0.0.0-20191111150521-6d806b998379 h1:0IbJWfv82eUhoNymvIrTjxVqrAURRK1x39+//IZV7Cc=\nknative.dev/pkg v0.0.0-20191111150521-6d806b998379/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=\nmodernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=\nmodernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=\nmodernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=\nmodernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=\nmodernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=\npack.ag/amqp v0.11.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4=\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=\nsigs.k8s.io/controller-runtime v0.2.0 h1:5gL30PXOisGZl+Osi4CmLhvMUj77BO3wJeouKF2va50=\nsigs.k8s.io/controller-runtime v0.2.0/go.mod h1:ZHqrRDZi3f6BzONcvlUxkqCKgwasGk5FZrnSv9TVZF4=\nsigs.k8s.io/controller-tools v0.2.2/go.mod h1:8SNGuj163x/sMwydREj7ld5mIMJu1cDanIfnx6xsU70=\nsigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0=\nsigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=\nsigs.k8s.io/kustomize/kyaml v0.1.10 h1:ZZfBnA/kYa9ZxUFIgI9oq3pWKzzA1gGOKgU0Hv/NhVg=\nsigs.k8s.io/kustomize/kyaml v0.1.10/go.mod h1:mPmeBSRy0LTMv6fSrYSoi2yIFNZVouGKDsTekE5kdhs=\nsigs.k8s.io/kustomize/kyaml v0.1.11 h1:/VvWxVIgH5gG1K4A7trgbyLgO3tRBiAWNhLFVU1HEmo=\nsigs.k8s.io/kustomize/kyaml v0.1.11/go.mod h1:72/rLkSi+L/pHM1oCjwrf3ClU+tH5kZQvvdLSqIHwWU=\nsigs.k8s.io/kustomize/v3 v3.2.0 h1:EKcEubO29vCbigcMoNynfyZH+ANWkML2UHWibt1Do7o=\nsigs.k8s.io/kustomize/v3 v3.2.0/go.mod h1:ztX4zYc/QIww3gSripwF7TBOarBTm5BvyAMem0kCzOE=\nsigs.k8s.io/structured-merge-diff v0.0.0-20190302045857-e85c7b244fd2/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=\nsigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=\nsigs.k8s.io/testing_frameworks v0.1.1 h1:cP2l8fkA3O9vekpy5Ks8mmA0NW/F7yBdXf8brkWhVrs=\nsigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U=\nsigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=\nsigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=\nvbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI=\n"
  },
  {
    "path": "hack/boilerplate.go.txt",
    "content": " \n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/"
  },
  {
    "path": "hack/cp_update.sh",
    "content": "#!/usr/bin/env bash\n\n#\n# this copies kubeflow/bootstrap/{go.*,cmd/kfctl,pkg} to here and updates all references \n# github.com/kubeflow/kubeflow/bootstrap -> github.com/kubeflow/kfctl\n\nkfctldir=$(dirname $0)/../../kubeflow/bootstrap\n\npreclean()\n{\n  rm $(find config pkg -name 'zz_generated*')\n  rm -rf go.* cmd pkg config\n}\n\ncpdirs() \n{\n  if [[ ! -d $kfctldir ]]; then\n    echo invalid directory $kfctldir >&2\n    exit\n  fi\n  if [[ ! -d cmd ]]; then\n    mkdir cmd\n  fi\n  cp -r $kfctldir/cmd/{kfctl,plugins} cmd\n  if [[ ! -d pkg ]]; then\n    mkdir pkg\n  fi\n  cp -r $kfctldir/pkg .\n  if [[ ! -d config ]]; then\n    mkdir config\n  fi\n  cp -r $kfctldir/config/{types.go,doc.go} config \n  cp $kfctldir/go.mod .\n}\n\nfindfiles() \n{\n  cd $kfctldir \n  find go.mod cmd pkg -type f -exec grep -l 'github.com\\/kubeflow\\/kubeflow\\/bootstrap\\/' {} \\;\n}\n\nupdatefiles() \n{\n  for i in $(findfiles); do\n    ex -s $i <<EOF\n%s#github.com/kubeflow/kubeflow/bootstrap#github.com/kubeflow/kfctl#g\nw\nq\nEOF\n  done\n}\n\nupdategomod()\n{\n    ex -s go.mod <<EOF1\n%s/^\\(.*\\)github.com\\/kubeflow\\/kubeflow\\/components\\/profile-controller\\/v2 =>.*$/\\1github.com\\/kubeflow\\/kubeflow\\/components\\/profile-controller\\/v2 => ..\\/kubeflow\\/components\\/profile-controller/g\nw\nq\nEOF1\n}\n\npreclean && cpdirs && updatefiles && updategomod\n"
  },
  {
    "path": "kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n- kustomize/base\n# only enable this if the k8s cluster is 1.15+ and has resource quota support\n#- kustomize/include/quota\n\nnamespace: kubeflow-operator\n"
  },
  {
    "path": "kustomize/base/kustomization.yaml",
    "content": "bases:\n- ../../deploy"
  },
  {
    "path": "kustomize/include/quota/kfdef_quota.yaml",
    "content": "apiVersion: v1\nkind: ResourceQuota\nmetadata:\n  name: kfdef-quota\nspec:\n  hard:\n    count/kfdefs.kfdef.apps.kubeflow.org: \"1\"\n"
  },
  {
    "path": "kustomize/include/quota/kustomization.yaml",
    "content": "resources:\n- kfdef_quota.yaml\n"
  },
  {
    "path": "operator.md",
    "content": "# Kubeflow Operator\n\nKubeflow Operator helps deploy, monitor and manage the lifecycle of Kubeflow. Built using the [Operator Framework](https://coreos.com/blog/introducing-operator-framework) which offers an open source toolkit to build, test, package operators and manage the lifecycle of operators.\n\nThe Operator is currently in incubation phase and is based on this [design doc](https://docs.google.com/document/d/1vNBZOM-gDMpwTbhx0EDU6lDpyUjc7vhT3bdOWWCRjdk/edit#). It is built on top of _KfDef_ CR, and uses _kfctl_ as the nucleus for Controller. Current roadmap for this Operator is listed [here](https://github.com/kubeflow/kfctl/issues/193). The Operator is also [published on OperatorHub](https://operatorhub.io/operator/kubeflow).\n\n## Prerequisites\n\n* Install [kustomize](https://github.com/kubernetes-sigs/kustomize/blob/master/docs/INSTALL.md)\n\n## Deployment Instructions\n\n1. Clone this repository, build the manifests and install the operator\n\n```shell\ngit clone https://github.com/kubeflow/kfctl.git && cd kfctl\n\nexport OPERATOR_NAMESPACE=operators\nkubectl create ns ${OPERATOR_NAMESPACE}\n\ncd deploy/\nkustomize edit set namespace ${OPERATOR_NAMESPACE}\n# kustomize edit add resource kustomize/include/quota # only deploy this if the k8s cluster is 1.15+ and has resource quota support, which will allow only one _kfdef_ instance or one deployment of Kubeflow on the cluster. This follows the singleton model, and is the current recommended and supported mode.\n\nkustomize build | kubectl apply -f -\n```\n\n2. Deploy KfDef\n   \n_KfDef_ can point to a remote URL or to a local kfdef file. To use the set of default kfdefs from Kubeflow, follow the [Deploy with default kfdefs](#deploy-with-default-kfdefs) section below.\n\n```shell\nKUBEFLOW_NAMESPACE=kubeflow\nkubectl create ns ${KUBEFLOW_NAMESPACE}\nkubectl create -f <kfdef> -n ${KUBEFLOW_NAMESPACE}\n```\n\n### Deploy with default kfdefs\n\nTo use the set of default kfdefs from Kubeflow, you will have to insert the `metadata.name` field before you can apply it to Kubernetes. Below are the commands for applying the Kubeflow _kfdef_ using Operator. For e.g. for IBM Cloud, commands will be\n> If you are pointing the kfdef file on the local machine, set the `KFDEF` to the kfdef file path and skip the `curl` command.\n\nFirst point to your Cloud provider kfdef. For e.g. for OpenShift, point to the kfdef in OpenDataHub repo\n\n```shell\nexport KFDEF_URL=https://raw.githubusercontent.com/opendatahub-io/manifests/v0.7-branch-openshift/kfdef/kfctl_openshift.yaml\n```\n\nSimilary for GCP, IBM Cloud etc. you can point to the respective kfdefs in Kubeflow repository, e.g.\n\n```shell\nexport KFDEF_URL=https://raw.githubusercontent.com/kubeflow/manifests/master/kfdef/kfctl_ibm.yaml\n```\n\nThen specify the `KUBEFLOW_DEPLOYMENT_NAME` you want to give to your deployment. Please note that currently multi-user deployments have a hard dependency on using `kubeflow` as the deployment name.\n\n```shell\nexport KUBEFLOW_DEPLOYMENT_NAME=kubeflow\nexport KFDEF=$(echo \"${KFDEF_URL}\" | rev | cut -d/ -f1 | rev)\ncurl -L ${KFDEF_URL} > ${KFDEF}\n```\n\nNext, we need to update the KFDEF file with the KUBEFLOW_DEPLOYMENT_NAME. We strongly recommend to install the [yq](https://github.com/mikefarah/yq) tool and run the `yq` command. However, if you can't install `yq`, you can run the `perl` command to do the same thing assuming you are using one of the kfdefs under the [manifests repository](https://github.com/kubeflow/manifests/tree/master/kfdef).\n\n```shell\nyq eval '.metadata.name = \"'${KUBEFLOW_DEPLOYMENT_NAME}'\"' ${KFDEF} > ${KFDEF}.tmp && mv ${KFDEF}.tmp ${KFDEF}\n# perl -pi -e $'s@metadata:@metadata:\\\\\\n  name: '\"${KUBEFLOW_DEPLOYMENT_NAME}\"'@' ${KFDEF}\n```\n\nLastly, deploy the kfdef resource to the cluster.\n```shell\nkubectl create -f ${KFDEF} -n ${KUBEFLOW_NAMESPACE}\n```\n\n## Testing Watcher and Reconciler\n\nOne of the major benefits of using kfctl as an Operator is to leverage the functionalities around being able to watch and reconcile your Kubeflow deployments. The Operator is watching on any cluster events for the _KfDef_ instance, as well as the _Delete_ event for all the resources whose owner is the _KfDef_ instance. Each of such events is queued as a request for the _reconciler_ to apply changes to the _KfDef_ instance. For example, if one of the Kubeflow resources is deleted, the _reconciler_ will be triggered to re-apply the _KfDef_ instance, and re-create the deleted resource on the cluster. Therefore, the Kubeflow deployment with this _KfDef_ instance will recover automatically from the unexpected delete event.\n\nTry following to see the operator watcher and reconciler in action:\n\n1. Check the tf-job-operator deployment is running\n\n```shell\nkubectl get deploy -n ${KUBEFLOW_NAMESPACE} tf-job-operator\n# NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE\n# tf-job-operator                               1/1     1            1           7m15s\n```\n\n2. Delete the tf-job-operator deployment\n\n```shell\nkubectl delete deploy -n ${KUBEFLOW_NAMESPACE} tf-job-operator\n# deployment.extensions \"tf-job-operator\" deleted\n```\n\n3. Wait for 10 to 15 seconds, then check the tf-job-operator deployment again\n\nYou will be able to see that the deployment is being recreated by the Operator's reconciliation logic.\n \n```Shell\nkubectl get deploy -n ${KUBEFLOW_NAMESPACE} tf-job-operator\n# NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE\n# tf-job-operator                               0/1     0            0           10s\n```\n\nThe Kubeflow operator also support multiple _KfDef_ instances deployment. It watches over all the _KfDef_ instances and handles reconcile requests to all the _KfDef_ instances. To understand more on the operator controller behavior, refer to this [controller-runtime link](https://github.com/kubernetes-sigs/controller-runtime/blob/master/pkg/doc.go).\n\nThe operator responds to following events:\n\n* When a _KfDef_ instance is created or updated, the operator's _reconciler_ will be notified of the event and invoke the `Apply` function provided by the [`kfctl` package](https://github.com/kubeflow/kfctl/tree/master/pkg) to deploy Kubeflow. The Kubeflow resources specified with the manifests will be added with the following annotation to indicate that they are owned by this _KfDef_ instance.\n  \n  ```\n  annotations:\n    kfctl.kubeflow.io/kfdef-instance: <kfdef-name>.<kfdef-namespace>\n  ```\n  \n\n* When a _KfDef_ instance is deleted, the operator's _reconciler_ will be notified of the event and invoke the finalizer to run the `Delete` function provided by the [`kfctl` package](https://github.com/kubeflow/kfctl/tree/master/pkg) and go through all applications and components owned by the _KfDef_ instance.\n\n* When any resource deployed as part of a _KfDef_ instance is deleted, the operator's _reconciler_ will be notified of the event and invoke the `Apply` function provided by the [`kfctl` package](https://github.com/kubeflow/kfctl/tree/master/pkg) to re-deploy Kubeflow. The deleted resource will be recreated with the same manifest which was specified when the _KfDef_ instance was created.\n\n## Delete Kubeflow\n\n* Delete Kubeflow deployment, the _KfDef_ instance\n\n```shell\nkubectl delete kfdef -n ${KUBEFLOW_NAMESPACE} --all\n```\n\n> Note that the users profile namespaces created by `profile-controller` will not be deleted. The `${KUBEFLOW_NAMESPACE}` created outside of the operator will not be deleted either. The delete process usually takes up to 15 minutes because the Operator needs to delete each component sequentially to avoid race conditions such as the [namespace finalizer issue](https://github.com/kubeflow/kfctl/issues/404).\n\n* Delete Kubeflow Operator\n\n```shell\nkubectl delete -f deploy/operator.yaml -n ${OPERATOR_NAMESPACE}\nkubectl delete clusterrolebinding kubeflow-operator\nkubectl delete -f deploy/service_account.yaml -n ${OPERATOR_NAMESPACE}\nkubectl delete -f deploy/crds/kfdef.apps.kubeflow.org_kfdefs_crd.yaml\nkubectl delete ns ${OPERATOR_NAMESPACE}\n```\n\n## Optional: Registering the Operator to OLM Catalog\n\nPlease follow the instructions [here](https://github.com/operator-framework/community-operators/blob/master/docs/testing-operators.md#testing-operator-deployment-on-openshift) to register your Operator to OLM if you are using that to install and manage the Operator. If you want to leverage the OperatorHub, please use the default [Kubeflow Operator registered there](https://operatorhub.io/operator/kubeflow)\n\n## Trouble Shooting\n\n* When deleting a Kubeflow deployment, some _mutatingwebhookconfigurations_ may not be removed as they are cluster-wide resources and dynamically created by the individual controller. It's a [known issue](https://github.com/kubeflow/manifests/issues/1379) for some of the Kubeflow components. To remove them, run the following:\n\n```shell\nkubectl delete mutatingwebhookconfigurations katib-mutating-webhook-config\nkubectl delete mutatingwebhookconfigurations cache-webhook-kubeflow\n```\n\n## Development Instructions\n\n### Prerequisites\n\n1. Install [operator-sdk](https://github.com/operator-framework/operator-sdk/blob/master/doc/user/install-operator-sdk.md)\n\n2. Install [golang](https://golang.org/dl/)\n\n3. Install [kustomize](https://github.com/kubernetes-sigs/kustomize/blob/master/docs/INSTALL.md)\n\n### Build Instructions\n\nThese steps are based on the [operator-sdk](https://github.com/operator-framework/operator-sdk/blob/master/doc/user-guide.md) with modifications that are specific for this Kubeflow operator.\n\n1. Clone this repository under your `$GOPATH`. (e.g. `~/go/src/github.com/kubeflow/`)\n\n```shell\ngit clone https://github.com/kubeflow/kfctl\ncd kfctl\n```\n\n2. Build and push the operator\n\n```shell\nexport OPERATOR_IMG=<docker_repo>\nmake build-operator\nmake push-operator\n```\n\n> Note: replace **<docker_repo>** with the image repo name and tag, for example, `docker.io/example/kubeflow-operator:latest`.\n\n3. Follow [Deployment Instructions](#deployment-instructions) section to test the operator with the newly built image\n\n## Current Tested Operators and Pre-built Images\n\nKubeflow Operator controller logic is based on the [`kfctl` package](https://github.com/kubeflow/kfctl/tree/master/pkg), so for each major release of `kfctl`, an operator image is built and tested with that version of [`manifests`](github.com/kubeflow/manifests) to deploy a _KfDef_ instance. Following table shows what releases have been tested.\n\n|branch tag|operator image|manifests version|kfdef example|note|\n|---|---|---|---|---|\n|[v1.0](https://github.com/kubeflow/kfctl/tree/v1.0)|[aipipeline/kubeflow-operator:v1.0.0](https://hub.docker.com/layers/aipipeline/kubeflow-operator/v1.0.0/images/sha256-63d00b29a61ff5bc9b0527c8a515cd4cb55de474c45d8e0f65742908ede4d88f?context=repo)|[1.0.0](https://github.com/kubeflow/manifests/tree/f56bb47d7dc5378497ad1e38ea99f7b5ebe7a950)|[kfctl_k8s_istio.v1.0.0.yaml](https://github.com/kubeflow/manifests/blob/f56bb47d7dc5378497ad1e38ea99f7b5ebe7a950/kfdef/kfctl_k8s_istio.v1.0.0.yaml)||\n|[v1.0.1](https://github.com/kubeflow/kfctl/tree/v1.0.1)|[aipipeline/kubeflow-operator:v1.0.1](https://hub.docker.com/layers/aipipeline/kubeflow-operator/v1.0.1/images/sha256-828024b773040271e4b547ce9219046f705fb7123e05503d5a2d1428dfbcfb6e?context=repo)|[1.0.1](https://github.com/kubeflow/manifests/tree/v1.0.1)|[kfctl_k8s_istio.v1.0.1.yaml](https://github.com/kubeflow/manifests/blob/v1.0.1/kfdef/kfctl_k8s_istio.v1.0.1.yaml)||\n|[v1.0.2](https://github.com/kubeflow/kfctl/tree/v1.0.2)|[aipipeline/kubeflow-operator:v1.0.2](https://hub.docker.com/layers/aipipeline/kubeflow-operator/v1.0.2/images/sha256-18d2ca6f19c1204d5654dfc4cc08032c168e89a95dee68572b9e2aaedada4bda?context=repo)|[1.0.2](https://github.com/kubeflow/manifests/tree/v1.0.2)|[kfctl_k8s_istio.v1.0.2.yaml](https://github.com/kubeflow/manifests/blob/v1.0.2/kfdef/kfctl_k8s_istio.v1.0.2.yaml)||\n|[master](https://github.com/kubeflow/kfctl)|[aipipeline/kubeflow-operator:master](https://hub.docker.com/layers/aipipeline/kubeflow-operator/master/images/sha256-e81020c426a12237c7cf84316dbbd0efda76e732233ddd57ef33543381dfb8a1?context=repo)|[master](https://github.com/kubeflow/manifests)|[kfctl_k8s_istio.yaml](https://github.com/kubeflow/manifests/blob/master/kfdef/kfctl_k8s_istio.yaml)|as of 05/15/2020|\n\n> Note: if building a customized operator for a specific version of Kubeflow is desired, you can run `git checkout` to that specific branch tag. Keep in mind to use the matching version of manifests.\n"
  },
  {
    "path": "pkg/apis/apis.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Generate deepcopy for apis\n// go:generate deepcopy-gen -O zz_generated.deepcopy -i ./... -h ../../hack/boilerplate.go.txt\n\n// Package apis contains Kubernetes API groups.\npackage apis\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// AddToSchemes may be used to add all resources defined in the project to a Scheme\nvar AddToSchemes runtime.SchemeBuilder\n\n// AddToScheme adds all Resources to the Scheme\nfunc AddToScheme(s *runtime.Scheme) error {\n\treturn AddToSchemes.AddToScheme(s)\n}\n"
  },
  {
    "path": "pkg/apis/apps/addtoscheme_kfdef_v1.go",
    "content": "package apps\n\nimport (\n\tv1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1\"\n)\n\nfunc init() {\n\t// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back\n\tAddToSchemes = append(AddToSchemes, v1.SchemeBuilder.AddToScheme)\n}\n"
  },
  {
    "path": "pkg/apis/apps/apis.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Generate deepcopy for apis\n// go:generate deepcopy-gen -O zz_generated.deepcopy -i ./... -h ../../hack/boilerplate.go.txt\n\n// Package apis contains Kubernetes API groups.\npackage apps\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// AddToSchemes may be used to add all resources defined in the project to a Scheme\nvar AddToSchemes runtime.SchemeBuilder\n\n// AddToScheme adds all Resources to the Scheme\nfunc AddToScheme(s *runtime.Scheme) error {\n\treturn AddToSchemes.AddToScheme(s)\n}\n"
  },
  {
    "path": "pkg/apis/apps/group.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package apps contains apps API versions\npackage apps\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"plugin\"\n\t\"regexp\"\n\t\"strings\"\n\n\tgogetter \"github.com/hashicorp/go-getter\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkfdefs \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n\tlog \"github.com/sirupsen/logrus\"\n\text \"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1\"\n\tcrdclientset \"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset\"\n\tapiext \"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1\"\n\t\"k8s.io/client-go/kubernetes\"\n\tclientset \"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/rest\"\n\t\"k8s.io/client-go/tools/clientcmd\"\n\tclientcmdapi \"k8s.io/client-go/tools/clientcmd/api\"\n)\n\nconst (\n\tDefaultNamespace = \"kubeflow\"\n\t// TODO: find the latest tag dynamically\n\tDefaultVersion         = \"master\"\n\tKfConfigFile           = \"app.yaml\"\n\tKustomizationFile      = \"kustomization.yaml\"\n\tKustomizationParamFile = \"params.env\"\n\tDefaultCacheDir        = \".cache\"\n\tKubeflowRepoName       = \"kubeflow\"\n\tManifestsRepoName      = \"manifests\"\n\tKubeflowRepo           = \"kubeflow\"\n\tManifestsRepo          = \"manifests\"\n\tDefaultConfigDir       = \"bootstrap/config\"\n\tDefaultZone            = \"us-east1-d\"\n\tDefaultGkeApiVer       = \"v1beta1\"\n\tDefaultAppLabel        = \"app.kubernetes.io/name\"\n\tDefaultAppVersion      = \"app.kubernetes.io/version\"\n\tDefaultAppType         = \"kubeflow\"\n\tKUBEFLOW_USERNAME      = \"KUBEFLOW_USERNAME\"\n\tKUBEFLOW_PASSWORD      = \"KUBEFLOW_PASSWORD\"\n\tDefaultSwaggerFile     = \"bootstrap/k8sSpec/v1.11.7/api/openapi-spec/swagger.json\"\n\tYamlSeparator          = \"(?m)^---[ \\t]*$\"\n\tDns1123LabelFmt        = \"[a-z0-9]([-a-z0-9]*[a-z0-9])?\"\n\tProfileNameMaxLen      = 30\n)\n\ntype SupportedResourceType string\n\nconst (\n\tKFDEF     SupportedResourceType = \"KfDef\"\n\tKFUPGRADE SupportedResourceType = \"KfUpgrade\"\n)\n\ntype ResourceEnum string\n\nconst (\n\tALL      ResourceEnum = \"all\"\n\tK8S      ResourceEnum = \"k8s\"\n\tPLATFORM ResourceEnum = \"platform\"\n)\n\ntype CliOption string\n\nconst (\n\tEMAIL                 CliOption = \"email\"\n\tIPNAME                CliOption = \"ipName\"\n\tHOSTNAME              CliOption = \"hostname\"\n\tMOUNT_LOCAL           CliOption = \"mount-local\"\n\tSKIP_INIT_GCP_PROJECT CliOption = \"skip-init-gcp-project\"\n\tVERBOSE               CliOption = \"verbose\"\n\tNAMESPACE             CliOption = \"namespace\"\n\tVERSION               CliOption = \"version\"\n\tREPO                  CliOption = \"repo\"\n\tPROJECT               CliOption = \"project\"\n\tAPPNAME               CliOption = \"appname\"\n\tDATA                  CliOption = \"Data\"\n\tZONE                  CliOption = \"zone\"\n\tDELETE_STORAGE        CliOption = \"delete-storage\"\n\tDISABLE_USAGE_REPORT  CliOption = \"disable-usage-report\"\n\tPACKAGE_MANAGER       CliOption = \"package-manager\"\n\tFILE                  CliOption = \"file\"\n\tFORCE_DELETION        CliOption = \"force-deletion\"\n\tDUMP                  CliOption = \"dump\"\n)\n\n//\n// KfApp provides a common\n// API for PackageManagers like ksonnet or kustomize\n// They all implement the API below\n//\ntype KfApp interface {\n\tApply(resources ResourceEnum) error\n\tDelete(resources ResourceEnum) error\n\tDump(resources ResourceEnum) error\n\tGenerate(resources ResourceEnum) error\n\tInit(resources ResourceEnum) error\n}\n\n//\n// Platform provides a common\n// API for platforms like gcp or minikube\n// They all implement the API below\n//\ntype Platform interface {\n\tKfApp\n}\n\n//\n// This is used in the ksonnet implementation for `ks show`\n//\ntype KfShow interface {\n\tShow(resources ResourceEnum) error\n}\n\n// QuoteItems will place quotes around the string arrays items\nfunc QuoteItems(items []string) []string {\n\tvar withQuotes []string\n\tfor _, item := range items {\n\t\twithQuote := \"\\\"\" + item + \"\\\"\"\n\t\twithQuotes = append(withQuotes, withQuote)\n\t}\n\treturn withQuotes\n}\n\n// RemoveItem will remove a string item from the string array\nfunc RemoveItem(defaults []string, name string) []string {\n\tvar pkgs []string\n\tfor _, pkg := range defaults {\n\t\tif pkg != name {\n\t\t\tpkgs = append(pkgs, pkg)\n\t\t}\n\t}\n\treturn pkgs\n}\n\n// Platforms\nconst (\n\tAWS              = \"aws\"\n\tGCP              = \"gcp\"\n\tMINIKUBE         = \"minikube\"\n\tEXISTING_ARRIKTO = \"existing_arrikto\"\n)\n\n// PackageManagers\nconst (\n\tKSONNET   = \"ksonnet\"\n\tKUSTOMIZE = \"kustomize\"\n)\n\n// LoadKfApp will load a shared library of the form <name>.so\nfunc LoadKfApp(name string, kfdef *kfdefs.KfDef) (KfApp, error) {\n\tpluginname := strings.Replace(name, \"-\", \"\", -1)\n\tplugindir := os.Getenv(\"PLUGINS_ENVIRONMENT\")\n\tpluginpath := filepath.Join(plugindir, name+\".so\")\n\tp, err := plugin.Open(pluginpath)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not load plugin %v for platform %v: %v\", pluginpath, pluginname, err),\n\t\t}\n\t}\n\tsymName := \"GetKfApp\"\n\tsymbol, symbolErr := p.Lookup(symName)\n\tif symbolErr != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not find symbol %v for platform %v: %v\", symName, pluginname, symbolErr),\n\t\t}\n\t}\n\treturn symbol.(func(*kfdefs.KfDef) KfApp)(kfdef), nil\n}\n\n// DownloadToCache will download a version of kubeflow github repo or the manifests repo where version can be\n//   master\n//\t tag\n//\t pull/<ID>[/head]\n// It returns the local file path of where the repo was downloaded\nfunc DownloadToCache(appDir string, repo string, version string) (string, error) {\n\tif _, err := os.Stat(appDir); os.IsNotExist(err) {\n\t\tappdirErr := os.Mkdir(appDir, os.ModePerm)\n\t\tif appdirErr != nil {\n\t\t\tlog.Errorf(\"Couldn't create directory %v: %v\", appDir, appdirErr)\n\t\t}\n\t}\n\tcacheDir := path.Join(appDir, DefaultCacheDir)\n\tcacheDir = path.Join(cacheDir, repo)\n\t// idempotency\n\tif _, err := os.Stat(cacheDir); !os.IsNotExist(err) {\n\t\t_ = os.RemoveAll(cacheDir)\n\t}\n\tcacheDirErr := os.MkdirAll(cacheDir, os.ModePerm)\n\tif cacheDirErr != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't create directory %v: %v\", cacheDir, cacheDirErr),\n\t\t}\n\t}\n\t// Version can be\n\t// --version master\n\t// --version tag\n\t// --version pull/<ID>/head\n\tif strings.HasPrefix(version, \"pull\") {\n\t\tif !strings.HasSuffix(version, \"head\") {\n\t\t\tversion = version + \"/head\"\n\t\t}\n\t}\n\ttarballUrl := \"https://github.com/kubeflow/\" + repo + \"/tarball/\" + version + \"?archive=tar.gz\"\n\ttarballUrlErr := gogetter.GetAny(cacheDir, tarballUrl)\n\tif tarballUrlErr != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't download kubeflow repo %v: %v\", tarballUrl, tarballUrlErr),\n\t\t}\n\t}\n\tfiles, filesErr := ioutil.ReadDir(cacheDir)\n\tif filesErr != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't read %v: %v\", cacheDir, filesErr),\n\t\t}\n\t}\n\tsubdir := files[0].Name()\n\textractedPath := filepath.Join(cacheDir, subdir)\n\tnewPath := filepath.Join(cacheDir, version)\n\tif strings.Contains(version, \"/\") {\n\t\tparts := strings.Split(version, \"/\")\n\t\tversionPath := cacheDir\n\t\tfor i := 0; i < len(parts)-1; i++ {\n\t\t\tversionPath = filepath.Join(versionPath, parts[i])\n\t\t\tversionPathErr := os.Mkdir(versionPath, os.ModePerm)\n\t\t\tif versionPathErr != nil {\n\t\t\t\treturn \"\", &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't create directory %v: %v\",\n\t\t\t\t\t\tversionPath, versionPathErr),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\trenameErr := os.Rename(extractedPath, newPath)\n\tif renameErr != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't rename %v to %v: %v\", extractedPath, newPath, renameErr),\n\t\t}\n\t}\n\treturn newPath, nil\n}\n\n// TODO(#2586): Consolidate kubeconfig and API calls.\n// KubeConfigPath returns the filepath to the k8 client config file\nfunc KubeConfigPath() string {\n\tkubeconfigEnv := os.Getenv(\"KUBECONFIG\")\n\tif kubeconfigEnv == \"\" {\n\t\thome := os.Getenv(\"HOMEDRIVE\") + os.Getenv(\"HOMEPATH\")\n\t\tif home == \"\" {\n\t\t\tfor _, h := range []string{\"HOME\", \"USERPROFILE\"} {\n\t\t\t\tif home = os.Getenv(h); home != \"\" {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tkubeconfigPath := filepath.Join(home, \".kube\", \"config\")\n\t\treturn kubeconfigPath\n\t}\n\treturn kubeconfigEnv\n}\n\n// GetConfig returns rest.Config using $HOME/.kube/config\nfunc GetConfig() *rest.Config {\n\tloadingRules := clientcmd.NewDefaultClientConfigLoadingRules()\n\tloadingRules.ExplicitPath = KubeConfigPath()\n\toverrides := &clientcmd.ConfigOverrides{}\n\tconfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides).ClientConfig()\n\tif err != nil {\n\t\tlog.Warnf(\"Could not open %v: %v\", loadingRules.ExplicitPath, err)\n\t\tlog.Infof(\"Trying to load rest.config with inClusterConfig...\")\n\t\tconfig, err = rest.InClusterConfig()\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"Could not load rest.config with inClusterConfig and %v\", loadingRules.ExplicitPath)\n\t\t}\n\t}\n\treturn config\n}\n\n// GetServerVersion returns the verison of the k8 api server\nfunc GetServerVersion(c *clientset.Clientset) string {\n\tserverVersion, serverVersionErr := c.ServerVersion()\n\tif serverVersionErr != nil {\n\t\tlog.Fatalf(\"Couldn't get server version info. Error: %v\", serverVersionErr)\n\t}\n\tre := regexp.MustCompile(\"^v[0-9]+.[0-9]+.[0-9]+\")\n\tversion := re.FindString(serverVersion.String())\n\treturn \"version:\" + version\n}\n\n// GetKubeConfig returns a representation of  $HOME/.kube/config\nfunc GetKubeConfig() *clientcmdapi.Config {\n\tkubeconfig := KubeConfigPath()\n\tconfig, configErr := clientcmd.LoadFromFile(kubeconfig)\n\tif configErr != nil {\n\t\tlog.Warnf(\"Could not load config Error: %v\", configErr)\n\t}\n\treturn config\n}\n\n// GetClientset returns a k8s clientset using .kube/config credentials\nfunc GetClientset(config *rest.Config) *clientset.Clientset {\n\tclientset, err := kubernetes.NewForConfig(config)\n\tif err != nil {\n\t\tlog.Fatalf(\"Can not get kubernetes kfdef: %v\", err)\n\t}\n\treturn clientset\n}\n\n// GetApiExtClientset returns a client that can query for CRDs\nfunc GetApiExtClientset(config *rest.Config) apiext.ApiextensionsV1beta1Interface {\n\tv := ext.SchemeGroupVersion\n\tconfig.GroupVersion = &v\n\tcrdClient, err := crdclientset.NewForConfig(config)\n\tif err != nil {\n\t\tlog.Fatalf(\"Can not get apiextensions kfdef: %v\", err)\n\t}\n\treturn crdClient.ApiextensionsV1beta1()\n}\n\n// Remove unvalid characters to compile a valid name for default Profile. To prevent\n// violation to the naming length restriction, ignore everything after `@`.\nfunc EmailToDefaultName(email string) string {\n\tname := strings.NewReplacer(\".\", \"-\").Replace(strings.ToLower(email))\n\tsplitted := strings.Split(name, \"@\")\n\tre := regexp.MustCompile(Dns1123LabelFmt)\n\ttoDns1123 := func(input string) string {\n\t\tresult := re.Find([]byte(input))\n\t\tif result == nil {\n\t\t\treturn \"\"\n\t\t}\n\t\tif len(result) > ProfileNameMaxLen {\n\t\t\tresult = result[0:ProfileNameMaxLen]\n\t\t}\n\t\treturn string(result)\n\t}\n\tif len(splitted) > 1 {\n\t\treturn toDns1123(\"kubeflow-\" + splitted[0])\n\t} else {\n\t\treturn toDns1123(\"kubeflow-\" + name)\n\t}\n}\n\n// Capture replaces os.Stdout with a writer that buffers any data written\n// to os.Stdout. Call the returned function to cleanup and get the data\n// as a string. This is used in cases where the API we're calling writes to stdout\n// eg ksonnet's show\nfunc Capture() func() (string, error) {\n\tr, w, err := os.Pipe()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdone := make(chan error, 1)\n\n\tsave := os.Stdout\n\tos.Stdout = w\n\n\tvar buf strings.Builder\n\n\tgo func() {\n\t\t_, err := io.Copy(&buf, r)\n\t\t_ = r.Close()\n\t\tdone <- err\n\t}()\n\n\treturn func() (string, error) {\n\t\tos.Stdout = save\n\t\t_ = w.Close()\n\t\terr := <-done\n\t\tif err == nil {\n\t\t\treturn buf.String(), nil\n\t\t} else {\n\t\t\treturn \"\", &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: err.Error(),\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/apis/apps/group_test.go",
    "content": "package apps\n\nimport (\n\t\"testing\"\n)\n\nfunc TestEmailToDefaultName(t *testing.T) {\n\n\ttestCases := [][]string{\n\t\t[]string{\n\t\t\t\"EmailToDefaultName\", \"kubeflow-emailtodefaultname\",\n\t\t},\n\t\t[]string{\n\t\t\t\"very-long-name-very-long-name-very-long-name\", \"kubeflow-very-long-name-very-l\",\n\t\t},\n\t\t// Strips after @\n\t\t[]string{\n\t\t\t\"foo@bar.com\", \"kubeflow-foo\",\n\t\t},\n\t\t// Keep everything if not having @\n\t\t[]string{\n\t\t\t\"foo\", \"kubeflow-foo\",\n\t\t},\n\t\t// Doesn't check if it's a valid email address.\n\t\t[]string{\n\t\t\t\"bar@baz\", \"kubeflow-bar\",\n\t\t},\n\t}\n\n\tfor _, c := range testCases {\n\t\to := EmailToDefaultName(c[0])\n\t\tif o != c[1] {\n\t\t\tt.Errorf(\"EmailToDefaultName test case error; input: %v; expect %v; get %v\", c[0], c[1], o)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/apis/apps/imagemirror/v1alpha1/replication_types.go",
    "content": "// Copyright 2020 The Kubeflow Authors\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\npackage v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\ntype Replication struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\tSpec              ReplicationSpec `json:\"spec,omitempty\"`\n}\n\n// List of image replication tasks defined by pattern\ntype ReplicationSpec struct {\n\tPatterns []Pattern `json:\"patterns,omitempty\"`\n\tContext  string    `json:\"context,omitempty\"`\n}\n\n// Application defines an application to install\ntype Pattern struct {\n\tSrc  SrcImages `json:\"src,omitempty\"`\n\tDest string    `json:\"dest,omitempty\"`\n}\n\ntype SrcImages struct {\n\tInclude string `json:\"include,omitempty\"`\n\tExclude string `json:\"exclude,omitempty\"`\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfconfig/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1alpha1 contains API Schema definitions for the kfconfig v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfconfig.apps.kubeflow.org\n\npackage kfconfig\n"
  },
  {
    "path": "pkg/apis/apps/kfconfig/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the kfdef v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfconfig.apps.kubeflow.org\npackage kfconfig\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"kfconfig.apps.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfConfig{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfconfig/types.go",
    "content": "package kfconfig\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/ghodss/yaml\"\n\tgogetter \"github.com/hashicorp/go-getter\"\n\t\"github.com/hashicorp/go-getter/helper/url\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\tv1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\nconst (\n\tDefaultCacheDir = \".cache\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// Internal data structure to hold app related info.\n// +k8s:openapi-gen=true\ntype KfConfig struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   KfConfigSpec `json:\"spec,omitempty\"`\n\tStatus Status       `json:\"status,omitempty\"`\n}\n\n// The spec of kKfConfig\ntype KfConfigSpec struct {\n\t// Shared fields among all components. should limit this list.\n\t// TODO(gabrielwen): Deprecate AppDir and move it to cache in Status.\n\tAppDir string `json:\"appDir,omitempty\"`\n\t// The filename of the config, e.g. app.yaml.\n\t// Base name only, as the directory is AppDir above.\n\tConfigFileName string `json:\"configFileName,omitempty\"`\n\n\tVersion string `json:\"version,omitempty\"`\n\n\t// TODO(gabrielwen): Can we infer this from Applications?\n\tUseBasicAuth bool `json:\"useBasicAuth,omitempty\"`\n\n\tPlatform string `json:\"platform,omitempty\"`\n\n\t// TODO(gabrielwen): Deprecate these fields as they only makes sense to GCP.\n\tProject         string `json:\"project,omitempty\"`\n\tEmail           string `json:\"email,omitempty\"`\n\tIpName          string `json:\"ipName,omitempty\"`\n\tHostname        string `json:\"hostname,omitempty\"`\n\tSkipInitProject bool   `json:\"skipInitProject,omitempty\"`\n\tZone            string `json:\"zone,omitempty\"`\n\n\tDeleteStorage bool `json:\"deleteStorage,omitempty\"`\n\n\tApplications []Application `json:\"applications,omitempty\"`\n\tPlugins      []Plugin      `json:\"plugins,omitempty\"`\n\tSecrets      []Secret      `json:\"secrets,omitempty\"`\n\tRepos        []Repo        `json:\"repos,omitempty\"`\n}\n\n// Application defines an application to install\ntype Application struct {\n\tName            string           `json:\"name,omitempty\"`\n\tKustomizeConfig *KustomizeConfig `json:\"kustomizeConfig,omitempty\"`\n}\n\ntype KustomizeConfig struct {\n\tRepoRef    *RepoRef    `json:\"repoRef,omitempty\"`\n\tOverlays   []string    `json:\"overlays,omitempty\"`\n\tParameters []NameValue `json:\"parameters,omitempty\"`\n}\n\ntype RepoRef struct {\n\tName string `json:\"name,omitempty\"`\n\tPath string `json:\"path,omitempty\"`\n}\n\ntype NameValue struct {\n\tName  string `json:\"name,omitempty\"`\n\tValue string `json:\"value,omitempty\"`\n}\n\ntype Plugin struct {\n\tName      string                `json:\"name,omitempty\"`\n\tNamespace string                `json:\"namespace,omitempty\"`\n\tKind      PluginKindType        `json:\"kind,omitempty\"`\n\tSpec      *runtime.RawExtension `json:\"spec,omitempty\"`\n}\n\n// Secret provides information about secrets needed to configure Kubeflow.\n// Secrets can be provided via references.\ntype Secret struct {\n\tName         string        `json:\"name,omitempty\"`\n\tSecretSource *SecretSource `json:\"secretSource,omitempty\"`\n}\n\ntype SecretSource struct {\n\tLiteralSource *LiteralSource `json:\"literalSource,omitempty\"`\n\tHashedSource  *HashedSource  `json:\"hashedSource,omitempty\"`\n\tEnvSource     *EnvSource     `json:\"envSource,omitempty\"`\n}\n\ntype LiteralSource struct {\n\tValue string `json:\"value,omitempty\"`\n}\n\ntype HashedSource struct {\n\tHashedValue string `json:\"value,omitempty\"`\n}\n\ntype EnvSource struct {\n\tName string `json:\"name,omitempty\"`\n}\n\n// SecretRef is a reference to a secret\ntype SecretRef struct {\n\t// Name of the secret\n\tName string `json:\"name,omitempty\"`\n}\n\n// Repo provides information about a repository providing config (e.g. kustomize packages,\n// Deployment manager configs, etc...)\ntype Repo struct {\n\t// Name is a name to identify the repository.\n\tName string `json:\"name,omitempty\"`\n\t// URI where repository can be obtained.\n\t// Can use any URI understood by go-getter:\n\t// https://github.com/hashicorp/go-getter/blob/master/README.md#installation-and-usage\n\tURI string `json:\"uri,omitempty\"`\n}\n\ntype Status struct {\n\tConditions []Condition `json:\"conditions,omitempty\"`\n\tCaches     []Cache     `json:\"caches,omitempty\"`\n}\n\ntype Condition struct {\n\t// Type of deployment condition.\n\tType ConditionType `json:\"type,omitempty\"`\n\t// Status of the condition, one of True, False, Unknown.\n\tStatus v1.ConditionStatus `json:\"status,omitempty\"`\n\t// The last time this condition was updated.\n\tLastUpdateTime metav1.Time `json:\"lastUpdateTime,omitempty\"`\n\t// Last time the condition transitioned from one status to another.\n\tLastTransitionTime metav1.Time `json:\"lastTransitionTime,omitempty\"`\n\t// The reason for the condition's last transition.\n\tReason string `json:\"reason,omitempty\"`\n\t// A human readable message indicating details about the transition.\n\tMessage string `json:\"message,omitempty\"`\n}\n\ntype Cache struct {\n\tName      string `json:\"name,omitempty\"`\n\tLocalPath string `json:\"localPath,omitempty\"`\n}\n\ntype PluginKindType string\n\nconst (\n\t// Used for populating plugin missing errors and identifying those\n\t// errors.\n\tpluginNotFoundErrPrefix = \"Missing plugin\"\n\n\t// Used for populating plugin missing errors and identifying those\n\t// errors.\n\tconditionNotFoundErrPrefix = \"Missing condition\"\n)\n\n// Plugin kind used starting from v1beta1\nconst (\n\tAWS_PLUGIN_KIND              PluginKindType = \"KfAwsPlugin\"\n\tGCP_PLUGIN_KIND              PluginKindType = \"KfGcpPlugin\"\n\tMINIKUBE_PLUGIN_KIND         PluginKindType = \"KfMinikubePlugin\"\n\tEXISTING_ARRIKTO_PLUGIN_KIND PluginKindType = \"KfExistingArriktoPlugin\"\n)\n\ntype ConditionType string\n\nconst (\n\t// Available means Kubeflow is serving.\n\tAvailable ConditionType = \"Available\"\n\n\t// Degraded means one or more Kubeflow services are not healthy.\n\tDegraded ConditionType = \"Degraded\"\n\n\t// Pending means Kubeflow services is being updated.\n\tPending ConditionType = \"Pending\"\n)\n\n// Define plugin related conditions to be the format:\n// - conditions for successful plugins: ${PluginKind}Succeeded\n// - conditions for failed plugins: ${PluginKind}Failed\nfunc GetPluginSucceededCondition(pluginKind PluginKindType) ConditionType {\n\treturn ConditionType(fmt.Sprintf(\"%vSucceeded\", pluginKind))\n}\nfunc GetPluginFailedCondition(pluginKind PluginKindType) ConditionType {\n\treturn ConditionType(fmt.Sprintf(\"%vFailed\", pluginKind))\n}\n\n// Returns the repo with the name and true if repo exists.\n// nil and false otherwise.\nfunc (c *KfConfig) GetRepoCache(repoName string) (Cache, bool) {\n\tfor _, r := range c.Status.Caches {\n\t\tif r.Name == repoName {\n\t\t\treturn r, true\n\t\t}\n\t}\n\treturn Cache{}, false\n}\n\nfunc (c *KfConfig) GetPluginSpec(pluginKind PluginKindType, s interface{}) error {\n\tfor _, p := range c.Spec.Plugins {\n\t\tif p.Kind != pluginKind {\n\t\t\tcontinue\n\t\t}\n\n\t\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t\t// and then unserialize it.\n\t\tspecBytes, err := yaml.Marshal(p.Spec)\n\t\tif err != nil {\n\t\t\tmsg := fmt.Sprintf(\"Could not marshal plugin %v args; error %v\", pluginKind, err)\n\t\t\tlog.Errorf(msg)\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: msg,\n\t\t\t}\n\t\t}\n\t\terr = yaml.Unmarshal(specBytes, s)\n\t\tif err != nil {\n\t\t\tmsg := fmt.Sprintf(\"Could not unmarshal plugin %v to the provided type; error %v\", pluginKind, err)\n\t\t\tlog.Errorf(msg)\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: msg,\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\treturn &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"%v %v\", pluginNotFoundErrPrefix, pluginKind),\n\t}\n}\n\n// SetPluginSpec sets the requested parameter: add the plugin if it doesn't already exist, or replace existing plugin.\nfunc (c *KfConfig) SetPluginSpec(pluginKind PluginKindType, spec interface{}) error {\n\t// Convert spec to RawExtension\n\tr := &runtime.RawExtension{}\n\n\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t// and then unserialize it.\n\tspecBytes, err := yaml.Marshal(spec)\n\n\tif err != nil {\n\t\tmsg := fmt.Sprintf(\"Could not marshal spec; error %v\", err)\n\t\tlog.Errorf(msg)\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: msg,\n\t\t}\n\t}\n\n\terr = yaml.Unmarshal(specBytes, r)\n\n\tif err != nil {\n\t\tmsg := fmt.Sprintf(\"Could not unmarshal plugin to RawExtension; error %v\", err)\n\t\tlog.Errorf(msg)\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: msg,\n\t\t}\n\t}\n\n\tindex := -1\n\n\tfor i, p := range c.Spec.Plugins {\n\t\tif p.Kind == pluginKind {\n\t\t\tindex = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif index == -1 {\n\t\t// Plugin in doesn't exist so add it\n\t\tlog.Infof(\"Adding plugin %v\", pluginKind)\n\n\t\tp := Plugin{}\n\t\tp.Name = string(pluginKind)\n\t\tp.Kind = pluginKind\n\t\tc.Spec.Plugins = append(c.Spec.Plugins, p)\n\n\t\tindex = len(c.Spec.Plugins) - 1\n\t}\n\n\tc.Spec.Plugins[index].Spec = r\n\treturn nil\n}\n\n// Sets condition and status to KfConfig.\nfunc (c *KfConfig) SetCondition(condType ConditionType,\n\tstatus v1.ConditionStatus,\n\treason string,\n\tmessage string) {\n\tnow := metav1.Now()\n\tcond := Condition{\n\t\tType:               condType,\n\t\tStatus:             status,\n\t\tLastUpdateTime:     now,\n\t\tLastTransitionTime: now,\n\t\tReason:             reason,\n\t\tMessage:            message,\n\t}\n\n\tfor i := range c.Status.Conditions {\n\t\tif c.Status.Conditions[i].Type != condType {\n\t\t\tcontinue\n\t\t}\n\t\tif c.Status.Conditions[i].Status == status {\n\t\t\tcond.LastTransitionTime = c.Status.Conditions[i].LastTransitionTime\n\t\t}\n\t\tc.Status.Conditions[i] = cond\n\t\treturn\n\t}\n\tc.Status.Conditions = append(c.Status.Conditions, cond)\n}\n\n// Gets condition from KfConfig.\nfunc (c *KfConfig) GetCondition(condType ConditionType) (*Condition, error) {\n\tfor i := range c.Status.Conditions {\n\t\tif c.Status.Conditions[i].Type == condType {\n\t\t\treturn &c.Status.Conditions[i], nil\n\t\t}\n\t}\n\treturn nil, &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"%v %v\", conditionNotFoundErrPrefix, condType),\n\t}\n}\n\nfunc (c *KfConfig) IsPluginFinished(pluginKind PluginKindType) bool {\n\tcondType := GetPluginSucceededCondition(pluginKind)\n\tcond, err := c.GetCondition(condType)\n\tif err != nil {\n\t\tif IsConditionNotFound(err) {\n\t\t\treturn false\n\t\t}\n\t\tlog.Warnf(\"Error when getting condition info: %v\", err)\n\t\treturn false\n\t}\n\treturn cond.Status == v1.ConditionTrue\n}\n\nfunc (c *KfConfig) SetPluginFinished(pluginKind PluginKindType, msg string) {\n\tsucceededCond := GetPluginSucceededCondition(pluginKind)\n\tfailedCond := GetPluginFailedCondition(pluginKind)\n\tif _, err := c.GetCondition(failedCond); err == nil {\n\t\tc.SetCondition(failedCond, v1.ConditionFalse, \"\",\n\t\t\t\"Reset to false as the plugin is set to be finished.\")\n\t}\n\n\tc.SetCondition(succeededCond, v1.ConditionTrue, \"\", msg)\n}\n\nfunc (c *KfConfig) IsPluginFailed(pluginKind PluginKindType) bool {\n\tcondType := GetPluginFailedCondition(pluginKind)\n\tcond, err := c.GetCondition(condType)\n\tif err != nil {\n\t\tif IsConditionNotFound(err) {\n\t\t\treturn false\n\t\t}\n\t\tlog.Warnf(\"Error when getting condition info: %v\", err)\n\t\treturn false\n\t}\n\treturn cond.Status == v1.ConditionTrue\n}\n\nfunc (c *KfConfig) SetPluginFailed(pluginKind PluginKindType, msg string) {\n\tsucceededCond := GetPluginSucceededCondition(pluginKind)\n\tfailedCond := GetPluginFailedCondition(pluginKind)\n\tif _, err := c.GetCondition(succeededCond); err == nil {\n\t\tc.SetCondition(succeededCond, v1.ConditionFalse,\n\t\t\t\"\", \"Reset to false as the plugin is set to be failed.\")\n\t}\n\n\tc.SetCondition(failedCond, v1.ConditionTrue, \"\", msg)\n}\n\n// SyncCache will synchronize the local cache of any repositories.\n// On success the status is updated with pointers to the cache.\n//\n// TODO(jlewi): I'm not sure this handles head references correctly.\n// e.g. suppose we have a URI like\n// https://github.com/kubeflow/manifests/tarball/pull/189/head?archive=tar.gz\n// This gets unpacked to: kubeflow-manifests-e2c1bcb where e2c1bcb is the commit.\n// I don't think the code is currently setting the local directory for the cache correctly in\n// that case.\n//\n//\n// Using tarball vs. archive in github links affects the download path\n// e.g.\n// https://github.com/kubeflow/manifests/tarball/master?archive=tar.gz\n//    unpacks to  kubeflow-manifests-${COMMIT}\n// https://github.com/kubeflow/manifests/archive/master.tar.gz\n//    unpacks to manifests-master\n// Always use archive format so that the path is predetermined.\n//\n// Instructions: https://github.com/hashicorp/go-getter#protocol-specific-options\n//\n// What is the correct syntax for downloading pull requests?\n// The following doesn't seem to work\n// https://github.com/kubeflow/manifests/archive/master.tar.gz?ref=pull/188\n//   * Appears to download master\n//\n// This appears to work\n// https://github.com/kubeflow/manifests/tarball/pull/188/head?archive=tar.gz\n// But unpacks it into\n// kubeflow-manifests-${COMMIT}\n//\nfunc (c *KfConfig) SyncCache() error {\n\tif c.Spec.AppDir == \"\" {\n\t\treturn fmt.Errorf(\"AppDir must be specified\")\n\t}\n\n\tappDir := c.Spec.AppDir\n\t// Loop over all the repos and download them.\n\t// TODO(https://github.com/kubeflow/kubeflow/issues/3545): We should check if we already have a local copy and\n\t// not redownload it.\n\n\tbaseCacheDir := path.Join(appDir, DefaultCacheDir)\n\tif _, err := os.Stat(baseCacheDir); os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating directory %v\", baseCacheDir)\n\t\tappdirErr := os.MkdirAll(baseCacheDir, os.ModePerm)\n\t\tif appdirErr != nil {\n\t\t\tlog.Errorf(\"Couldn't create directory %v: %v\", baseCacheDir, appdirErr)\n\t\t\treturn appdirErr\n\t\t}\n\t}\n\n\tfor _, r := range c.Spec.Repos {\n\t\tcacheDir := path.Join(baseCacheDir, r.Name)\n\n\t\t// Can we use a checksum or other mechanism to verify if the existing location is good?\n\t\t// If there was a problem the first time around then removing it might provide a way to recover.\n\t\tif _, err := os.Stat(cacheDir); err == nil {\n\t\t\t// Check if the cache is up to date.\n\t\t\tshouldSkip := false\n\t\t\tfor _, cache := range c.Status.Caches {\n\t\t\t\tif cache.Name == r.Name && cache.LocalPath != \"\" {\n\t\t\t\t\tshouldSkip = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif shouldSkip {\n\t\t\t\tlog.Infof(\"%v exists; not resyncing \", cacheDir)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlog.Infof(\"Deleting cachedir %v because Status.ReposCache is out of date\", cacheDir)\n\n\t\t\t// TODO(jlewi): The reason the cachedir might exist but not be stored in KfDef.status\n\t\t\t// is because of a backwards compatibility path in which we download the cache to construct\n\t\t\t// the KfDef. Specifically coordinator.CreateKfDefFromOptions is calling kftypes.DownloadFromCache\n\t\t\t// We don't want to rely on that method to set the cache because we have logic\n\t\t\t// below to set LocalPath that we don't want to duplicate.\n\t\t\t// Unfortunately this means we end up fetching the repo twice which is very inefficient.\n\t\t\tif err := os.RemoveAll(cacheDir); err != nil {\n\t\t\t\tlog.Errorf(\"There was a problem deleting directory %v; error %v\", cacheDir, err)\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t}\n\n\t\tu, err := url.Parse(r.URI)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not parse URI %v; error %v\", r.URI, err)\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tlog.Infof(\"Fetching %v to %v\", r.URI, cacheDir)\n\t\ttarballUrlErr := gogetter.GetAny(cacheDir, r.URI)\n\t\tif tarballUrlErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"couldn't download URI %v: %v\", r.URI, tarballUrlErr),\n\t\t\t}\n\t\t}\n\n\t\t// This is a bit of a hack to deal with the fact that GitHub tarballs\n\t\t// can unpack to a directory containing the commit.\n\t\tlocalPath := cacheDir\n\t\tif u.Scheme == \"http\" || u.Scheme == \"https\" {\n\t\t\tfiles, filesErr := ioutil.ReadDir(cacheDir)\n\t\t\tif filesErr != nil {\n\t\t\t\tlog.Errorf(\"Error reading cachedir; error %v\", filesErr)\n\t\t\t\treturn errors.WithStack(filesErr)\n\t\t\t}\n\t\t\tsubdir := files[0].Name()\n\t\t\tlocalPath = path.Join(cacheDir, subdir)\n\t\t}\n\n\t\tc.Status.Caches = append(c.Status.Caches, Cache{\n\t\t\tName:      r.Name,\n\t\t\tLocalPath: localPath,\n\t\t})\n\n\t\tlog.Infof(\"Fetch succeeded; LocalPath %v\", localPath)\n\t}\n\treturn nil\n}\n\n// GetSecret returns the specified secret or an error if the secret isn't specified.\nfunc (c *KfConfig) GetSecret(name string) (string, error) {\n\tfor _, s := range c.Spec.Secrets {\n\t\tif s.Name != name {\n\t\t\tcontinue\n\t\t}\n\t\tif s.SecretSource.LiteralSource != nil {\n\t\t\treturn s.SecretSource.LiteralSource.Value, nil\n\t\t}\n\t\tif s.SecretSource.HashedSource != nil {\n\t\t\treturn s.SecretSource.HashedSource.HashedValue, nil\n\t\t}\n\t\tif s.SecretSource.EnvSource != nil {\n\t\t\treturn os.Getenv(s.SecretSource.EnvSource.Name), nil\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"No secret source provided for secret %v\", name)\n\t}\n\treturn \"\", NewSecretNotFound(name)\n}\n\n// GetSecretSource returns the SecretSource of the specified name or an error if the secret isn't specified.\nfunc (c *KfConfig) GetSecretSource(name string) (*SecretSource, error) {\n\tfor _, s := range c.Spec.Secrets {\n\t\tif s.Name == name {\n\t\t\treturn s.SecretSource, nil\n\t\t}\n\t}\n\treturn nil, NewSecretNotFound(name)\n}\n\n// GetApplicationParameter gets the desired application parameter.\nfunc (c *KfConfig) GetApplicationParameter(appName string, paramName string) (string, bool) {\n\t// First we check applications for an application with the specified name.\n\tif c.Spec.Applications != nil {\n\t\tfor _, a := range c.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\treturn getParameter(a.KustomizeConfig.Parameters, paramName)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn \"\", false\n}\n\n// SetApplicationParameter sets the desired application parameter.\nfunc (c *KfConfig) SetApplicationParameter(appName string, paramName string, value string) error {\n\t// First we check applications for an application with the specified name.\n\tif c.Spec.Applications != nil {\n\t\tappIndex := -1\n\t\tfor i, a := range c.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\tappIndex = i\n\t\t\t}\n\t\t}\n\n\t\tif appIndex >= 0 {\n\n\t\t\tif c.Spec.Applications[appIndex].KustomizeConfig == nil {\n\t\t\t\treturn errors.WithStack(fmt.Errorf(\"Application %v doesn't have KustomizeConfig\", appName))\n\t\t\t}\n\n\t\t\tc.Spec.Applications[appIndex].KustomizeConfig.Parameters = setParameter(\n\t\t\t\tc.Spec.Applications[appIndex].KustomizeConfig.Parameters, paramName, value)\n\n\t\t\treturn nil\n\t\t}\n\n\t}\n\tlog.Warnf(\"Application %v not found\", appName)\n\treturn nil\n}\n\n// SetSecret sets the specified secret; if a secret with the given name already exists it is overwritten.\nfunc (c *KfConfig) SetSecret(newSecret Secret) {\n\tfor i, s := range c.Spec.Secrets {\n\t\tif s.Name == newSecret.Name {\n\t\t\tc.Spec.Secrets[i] = newSecret\n\t\t\treturn\n\t\t}\n\t}\n\n\tc.Spec.Secrets = append(c.Spec.Secrets, newSecret)\n}\n\nfunc IsPluginNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\terr, ok := e.(*kfapis.KfError)\n\treturn ok && err.Code == int(kfapis.NOT_FOUND) && strings.HasPrefix(err.Message, pluginNotFoundErrPrefix)\n}\n\nfunc IsConditionNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\terr, ok := e.(*kfapis.KfError)\n\treturn ok && err.Code == int(kfapis.NOT_FOUND) &&\n\t\tstrings.HasPrefix(err.Message, conditionNotFoundErrPrefix)\n}\n\ntype SecretNotFound struct {\n\tName string\n}\n\nfunc (e *SecretNotFound) Error() string {\n\treturn fmt.Sprintf(\"Missing secret %v\", e.Name)\n}\n\nfunc NewSecretNotFound(n string) *SecretNotFound {\n\treturn &SecretNotFound{\n\t\tName: n,\n\t}\n}\n\nfunc IsSecretNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\t_, ok := e.(*SecretNotFound)\n\treturn ok\n}\n\ntype AppNotFound struct {\n\tName string\n}\n\nfunc (e *AppNotFound) Error() string {\n\treturn fmt.Sprintf(\"Application %v is missing\", e.Name)\n}\n\nfunc IsAppNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\t_, ok := e.(*AppNotFound)\n\treturn ok\n}\n\nfunc getParameter(parameters []NameValue, paramName string) (string, bool) {\n\tfor _, p := range parameters {\n\t\tif p.Name == paramName {\n\t\t\treturn p.Value, true\n\t\t}\n\t}\n\n\treturn \"\", false\n}\n\nfunc setParameter(parameters []NameValue, paramName string, value string) []NameValue {\n\tpIndex := -1\n\n\tfor i, p := range parameters {\n\t\tif p.Name == paramName {\n\t\t\tpIndex = i\n\t\t}\n\t}\n\n\tif pIndex < 0 {\n\t\tparameters = append(parameters, NameValue{})\n\t\tpIndex = len(parameters) - 1\n\t}\n\n\tparameters[pIndex].Name = paramName\n\tparameters[pIndex].Value = value\n\n\treturn parameters\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfconfig/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage kfconfig\n\nimport (\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *AppNotFound) DeepCopyInto(out *AppNotFound) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AppNotFound.\nfunc (in *AppNotFound) DeepCopy() *AppNotFound {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(AppNotFound)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Application) DeepCopyInto(out *Application) {\n\t*out = *in\n\tif in.KustomizeConfig != nil {\n\t\tin, out := &in.KustomizeConfig, &out.KustomizeConfig\n\t\t*out = new(KustomizeConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Application.\nfunc (in *Application) DeepCopy() *Application {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Application)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Cache) DeepCopyInto(out *Cache) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Cache.\nfunc (in *Cache) DeepCopy() *Cache {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Cache)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Condition) DeepCopyInto(out *Condition) {\n\t*out = *in\n\tin.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)\n\tin.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition.\nfunc (in *Condition) DeepCopy() *Condition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Condition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *EnvSource) DeepCopyInto(out *EnvSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvSource.\nfunc (in *EnvSource) DeepCopy() *EnvSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(EnvSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *HashedSource) DeepCopyInto(out *HashedSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HashedSource.\nfunc (in *HashedSource) DeepCopy() *HashedSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(HashedSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfConfig) DeepCopyInto(out *KfConfig) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfConfig.\nfunc (in *KfConfig) DeepCopy() *KfConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfConfig) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfConfigSpec) DeepCopyInto(out *KfConfigSpec) {\n\t*out = *in\n\tif in.Applications != nil {\n\t\tin, out := &in.Applications, &out.Applications\n\t\t*out = make([]Application, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Plugins != nil {\n\t\tin, out := &in.Plugins, &out.Plugins\n\t\t*out = make([]Plugin, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Secrets != nil {\n\t\tin, out := &in.Secrets, &out.Secrets\n\t\t*out = make([]Secret, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Repos != nil {\n\t\tin, out := &in.Repos, &out.Repos\n\t\t*out = make([]Repo, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfConfigSpec.\nfunc (in *KfConfigSpec) DeepCopy() *KfConfigSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfConfigSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KustomizeConfig) DeepCopyInto(out *KustomizeConfig) {\n\t*out = *in\n\tif in.RepoRef != nil {\n\t\tin, out := &in.RepoRef, &out.RepoRef\n\t\t*out = new(RepoRef)\n\t\t**out = **in\n\t}\n\tif in.Overlays != nil {\n\t\tin, out := &in.Overlays, &out.Overlays\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Parameters != nil {\n\t\tin, out := &in.Parameters, &out.Parameters\n\t\t*out = make([]NameValue, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KustomizeConfig.\nfunc (in *KustomizeConfig) DeepCopy() *KustomizeConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KustomizeConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *LiteralSource) DeepCopyInto(out *LiteralSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LiteralSource.\nfunc (in *LiteralSource) DeepCopy() *LiteralSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(LiteralSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *NameValue) DeepCopyInto(out *NameValue) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NameValue.\nfunc (in *NameValue) DeepCopy() *NameValue {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(NameValue)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Plugin) DeepCopyInto(out *Plugin) {\n\t*out = *in\n\tif in.Spec != nil {\n\t\tin, out := &in.Spec, &out.Spec\n\t\t*out = new(runtime.RawExtension)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Plugin.\nfunc (in *Plugin) DeepCopy() *Plugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Plugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Repo) DeepCopyInto(out *Repo) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Repo.\nfunc (in *Repo) DeepCopy() *Repo {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Repo)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoRef) DeepCopyInto(out *RepoRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoRef.\nfunc (in *RepoRef) DeepCopy() *RepoRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Secret) DeepCopyInto(out *Secret) {\n\t*out = *in\n\tif in.SecretSource != nil {\n\t\tin, out := &in.SecretSource, &out.SecretSource\n\t\t*out = new(SecretSource)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Secret.\nfunc (in *Secret) DeepCopy() *Secret {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Secret)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretNotFound) DeepCopyInto(out *SecretNotFound) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNotFound.\nfunc (in *SecretNotFound) DeepCopy() *SecretNotFound {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretNotFound)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretRef) DeepCopyInto(out *SecretRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretRef.\nfunc (in *SecretRef) DeepCopy() *SecretRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretSource) DeepCopyInto(out *SecretSource) {\n\t*out = *in\n\tif in.LiteralSource != nil {\n\t\tin, out := &in.LiteralSource, &out.LiteralSource\n\t\t*out = new(LiteralSource)\n\t\t**out = **in\n\t}\n\tif in.HashedSource != nil {\n\t\tin, out := &in.HashedSource, &out.HashedSource\n\t\t*out = new(HashedSource)\n\t\t**out = **in\n\t}\n\tif in.EnvSource != nil {\n\t\tin, out := &in.EnvSource, &out.EnvSource\n\t\t*out = new(EnvSource)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretSource.\nfunc (in *SecretSource) DeepCopy() *SecretSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Status) DeepCopyInto(out *Status) {\n\t*out = *in\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]Condition, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Caches != nil {\n\t\tin, out := &in.Caches, &out.Caches\n\t\t*out = make([]Cache, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Status.\nfunc (in *Status) DeepCopy() *Status {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Status)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/kfdef.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package kfdef contains kfdef related types\npackage kfdef\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/testdata/doc.go",
    "content": "package testdata\n\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/README.md",
    "content": "## `KfDef` defines an interface for controlling Kubeflow resources\n\nIn the following sections we explain what fields in `KfDefSpec` means.\n\n### KfDefSpec.Applications\n\nThis is the list of applications that Kubeflow cluster will be installed.\n\n- Name: Name identifier of the application.\n- KustomizeConfig: Configurations for Kustomize to find the manifests and additional information to apply to.\n\n#### KustomizeConfig\n\n- RepoRef:\n  - Name: Name of the repo Kustomize will be looking into.  The repo must be on the list of `KfDefSpec.Repos`.\n  - Path: Relative path in the repo to find the manifests.\n- Overlays: A list of names to be applied as overlays.\n- Parameters: Name/value pair of parameters to override the parameters defined in manifests.  Example: [link](https://github.com/kubeflow/manifests/blob/master/profiles/base/params.env#L3-L4)\n\n### KfDefSpec.Plugins\n\nThis is the list of plugins that Kubeflow will be run on top of.  For example, platforms like GCP/AWS are part of plugins.\n\n- Definitions of plugins should go to [plugins folder](https://github.com/kubeflow/kfctl/tree/master/pkg/apis/apps/plugins).\n- Plugins must have associated [kfapp handler](https://github.com/kubeflow/kfctl/tree/master/pkg/kfapp) for them to be applied.\n\n### KfDefSpec.Secrets\n\nThis is a set of secrets Kubeflow needs during installation.\n\n- LiteralSource: User provides the secret information as literal string into `KfDef` yaml file.  This is not recommended and we are planning to deprecate it.\n- EnvSource: User provides the name of ENV var and we will use the value for create the secret.\n\n### KfDefSpec.Repos\n\nThis is a list of GIT repositories that we will cache and use as reference during installations.\n\n- Name: The name identifier of the repository cached.\n- URI: The URI to download the repository.\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/application_types.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1\n\nimport (\n\t\"fmt\"\n\t\"github.com/ghodss/yaml\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tlog \"github.com/sirupsen/logrus\"\n\tv1 \"k8s.io/api/core/v1\"\n\tvalid \"k8s.io/apimachinery/pkg/api/validation\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"os\"\n\t\"strings\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfDef is the Schema for the applications API\n// +k8s:openapi-gen=true\ntype KfDef struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   KfDefSpec   `json:\"spec,omitempty\"`\n\tStatus KfDefStatus `json:\"status,omitempty\"`\n}\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfDefList contains a list of KfDef\ntype KfDefList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []KfDef `json:\"items\"`\n}\n\ntype KfDefSpec struct {\n\tVersion      string        `json:\"version,omitempty\"`\n\tApplications []Application `json:\"applications,omitempty\"`\n\tPlugins      []Plugin      `json:\"plugins,omitempty\"`\n\tSecrets      []Secret      `json:\"secrets,omitempty\"`\n\tRepos        []Repo        `json:\"repos,omitempty\"`\n}\n\n// Application defines an application to install\ntype Application struct {\n\tName            string           `json:\"name,omitempty\"`\n\tKustomizeConfig *KustomizeConfig `json:\"kustomizeConfig,omitempty\"`\n}\n\ntype KustomizeConfig struct {\n\tRepoRef    *RepoRef    `json:\"repoRef,omitempty\"`\n\tOverlays   []string    `json:\"overlays,omitempty\"`\n\tParameters []NameValue `json:\"parameters,omitempty\"`\n}\n\ntype RepoRef struct {\n\tName string `json:\"name,omitempty\"`\n\tPath string `json:\"path,omitempty\"`\n}\n\ntype NameValue struct {\n\tName  string `json:\"name,omitempty\"`\n\tValue string `json:\"value,omitempty\"`\n}\n\n// Plugin can be used to customize the generation and deployment of Kubeflow\ntype Plugin struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec *runtime.RawExtension `json:\"spec,omitempty\"`\n}\n\n// Secret provides information about secrets needed to configure Kubeflow.\n// Secrets can be provided via references.\ntype Secret struct {\n\tName         string        `json:\"name,omitempty\"`\n\tSecretSource *SecretSource `json:\"secretSource,omitempty\"`\n}\n\ntype SecretSource struct {\n\tLiteralSource *LiteralSource `json:\"literalSource,omitempty\"`\n\tEnvSource     *EnvSource     `json:\"envSource,omitempty\"`\n}\n\ntype LiteralSource struct {\n\tValue string `json:\"value,omitempty\"`\n}\n\ntype EnvSource struct {\n\tName string `json:\"name,omitempty\"`\n}\n\n// SecretRef is a reference to a secret\ntype SecretRef struct {\n\t// Name of the secret\n\tName string `json:\"name,omitempty\"`\n}\n\n// Repo provides information about a repository providing config (e.g. kustomize packages,\n// Deployment manager configs, etc...)\ntype Repo struct {\n\t// Name is a name to identify the repository.\n\tName string `json:\"name,omitempty\"`\n\t// URI where repository can be obtained.\n\t// Can use any URI understood by go-getter:\n\t// https://github.com/hashicorp/go-getter/blob/master/README.md#installation-and-usage\n\tURI string `json:\"uri,omitempty\"`\n}\n\n// KfDefStatus defines the observed state of KfDef\ntype KfDefStatus struct {\n\tConditions []KfDefCondition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"`\n\t// ReposCache is used to cache information about local caching of the URIs.\n\tReposCache []RepoCache `json:\"reposCache,omitempty\"`\n}\n\ntype RepoCache struct {\n\tName      string `json:\"name,omitempty\"`\n\tLocalPath string `json:\"localPath,string\"`\n}\n\ntype KfDefConditionType string\n\nconst (\n\t// KfAvailable means Kubeflow is serving.\n\tKfAvailable KfDefConditionType = \"Available\"\n\n\t// KfDegraded means one or more Kubeflow services are not healthy.\n\tKfDegraded KfDefConditionType = \"Degraded\"\n\n\t// Pending means Kubeflow services is being updated.\n\tPending KfDefConditionType = \"Pending\"\n)\n\ntype KfDefCondition struct {\n\t// Type of deployment condition.\n\tType KfDefConditionType `json:\"type\"`\n\t// Status of the condition, one of True, False, Unknown.\n\tStatus v1.ConditionStatus `json:\"status\"`\n\t// The last time this condition was updated.\n\tLastUpdateTime metav1.Time `json:\"lastUpdateTime,omitempty\"`\n\t// Last time the condition transitioned from one status to another.\n\tLastTransitionTime metav1.Time `json:\"lastTransitionTime,omitempty\"`\n\t// The reason for the condition's last transition.\n\tReason string `json:\"reason,omitempty\"`\n\t// A human readable message indicating details about the transition.\n\tMessage string `json:\"message,omitempty\"`\n}\n\n// GetPluginSpec will try to unmarshal the spec for the specified plugin to the supplied\n// interface. Returns an error if the plugin isn't defined or if there is a problem\n// unmarshaling it.\nfunc (d *KfDef) GetPluginSpec(pluginKind string, s interface{}) error {\n\tfor _, p := range d.Spec.Plugins {\n\t\tif p.Kind != pluginKind {\n\t\t\tcontinue\n\t\t}\n\t\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t\t// and then unserialize it.\n\t\tspecBytes, err := yaml.Marshal(p.Spec)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not marshal plugin %v args; error %v\", pluginKind, err)\n\t\t\treturn err\n\t\t}\n\n\t\terr = yaml.Unmarshal(specBytes, s)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not unmarshal plugin %v to the provided type; error %v\", pluginKind, err)\n\t\t}\n\t\treturn nil\n\t}\n\treturn &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"Plugin not found: %v\", pluginKind),\n\t}\n}\n\n// SetPluginSpec sets the requested parameter: add the plugin if it doesn't already exist, or replace existing plugin.\nfunc (d *KfDef) SetPluginSpec(pluginKind string, spec interface{}) error {\n\t// Convert spec to RawExtension\n\n\tr := &runtime.RawExtension{}\n\n\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t// and then unserialize it.\n\tspecBytes, err := yaml.Marshal(spec)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not marshal spec; error %v\", err)\n\t\treturn err\n\t}\n\n\terr = yaml.Unmarshal(specBytes, r)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not unmarshal plugin to RawExtension; error %v\", err)\n\t}\n\n\tindex := -1\n\n\tfor i, p := range d.Spec.Plugins {\n\t\tif p.Kind == pluginKind {\n\t\t\tindex = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif index == -1 {\n\t\t// Plugin in doesn't exist so add it\n\t\tlog.Infof(\"Adding plugin %v\", pluginKind)\n\n\t\tp := Plugin{}\n\t\tp.Name = string(pluginKind)\n\t\tp.Kind = pluginKind\n\t\td.Spec.Plugins = append(d.Spec.Plugins, p)\n\n\t\tindex = len(d.Spec.Plugins) - 1\n\t}\n\n\td.Spec.Plugins[index].Spec = r\n\treturn nil\n}\n\n// GetSecret returns the specified secret or an error if the secret isn't specified.\nfunc (d *KfDef) GetSecret(name string) (string, error) {\n\tfor _, s := range d.Spec.Secrets {\n\t\tif s.Name != name {\n\t\t\tcontinue\n\t\t}\n\t\tif s.SecretSource.LiteralSource != nil {\n\t\t\treturn s.SecretSource.LiteralSource.Value, nil\n\t\t}\n\t\tif s.SecretSource.EnvSource != nil {\n\t\t\treturn os.Getenv(s.SecretSource.EnvSource.Name), nil\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"No secret source provided for secret %v\", name)\n\t}\n\treturn \"\", &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"Secret not found: %v\", name),\n\t}\n}\n\n// SetSecret sets the specified secret; if a secret with the given name already exists it is overwritten.\nfunc (d *KfDef) SetSecret(newSecret Secret) {\n\tfor i, s := range d.Spec.Secrets {\n\t\tif s.Name == newSecret.Name {\n\t\t\td.Spec.Secrets[i] = newSecret\n\t\t\treturn\n\t\t}\n\t}\n\td.Spec.Secrets = append(d.Spec.Secrets, newSecret)\n}\n\nfunc (d *KfDef) DeleteApplication(appName string) {\n\t// First we check applications for an application with the specified name.\n\tif d.Spec.Applications != nil {\n\t\tapplications := []Application{}\n\t\tfor _, a := range d.Spec.Applications {\n\t\t\tif a.Name != appName {\n\t\t\t\tapplications = append(applications, a)\n\t\t\t}\n\t\t}\n\t\td.Spec.Applications = applications\n\t}\n}\n\n// IsValid returns true if the spec is a valid and complete spec.\n// If false it will also return a string providing a message about why its invalid.\nfunc (d *KfDef) IsValid() (bool, string) {\n\t// Validate KfConfig\n\terrs := valid.NameIsDNSLabel(d.Name, false)\n\tif errs != nil && len(errs) > 0 {\n\t\treturn false, fmt.Sprintf(\"invalid name due to %v\", strings.Join(errs, \",\"))\n\t}\n\n\treturn true, \"\"\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/application_types_test.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/prometheus/common/log\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"reflect\"\n\t\"testing\"\n)\n\ntype FakePluginSpec struct {\n\tParam     string `json:\"param,omitempty\"`\n\tBoolParam bool   `json:\"boolParam,omitempty\"`\n}\n\nfunc TestKfDef_GetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tFilename   string\n\t\tPluginKind string\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tFilename:   \"kfctl_plugin_test.yaml\",\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"someparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Filename)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\n\t\tlog.Infof(\"Want \")\n\t\td := &KfDef{}\n\t\terr := yaml.Unmarshal(buf, d)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not parse as KfDef error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginKind, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin spec got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_SetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tPluginKind string\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"oldparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Override the existing plugin\n\t\t{\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Add a new plugin\n\t\t{\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\td := &KfDef{}\n\n\tfor _, c := range cases {\n\t\terr := d.SetPluginSpec(c.PluginKind, c.Expected)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not set plugin spec; error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginKind, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin spec got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_GetSecret(t *testing.T) {\n\td := &KfDef{\n\t\tSpec: KfDefSpec{\n\t\t\tSecrets: []Secret{\n\t\t\t\t{\n\t\t\t\t\tName: \"s1\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\tValue: \"somedata\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"s2\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tEnvSource: &EnvSource{\n\t\t\t\t\t\t\tName: \"s2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\ttype testCase struct {\n\t\tSecretName    string\n\t\tExpectedValue string\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tSecretName:    \"s1\",\n\t\t\tExpectedValue: \"somedata\",\n\t\t},\n\t\t{\n\t\t\tSecretName:    \"s2\",\n\t\t\tExpectedValue: \"somesecret\",\n\t\t},\n\t}\n\n\tos.Setenv(\"s2\", \"somesecret\")\n\tfor _, c := range cases {\n\t\tactual, err := d.GetSecret(c.SecretName)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Error getting secret %v; error %v\", c.SecretName, err)\n\t\t}\n\n\t\tif actual != c.ExpectedValue {\n\t\t\tt.Errorf(\"Secret %v value is wrong; got %v; want %v\", c.SecretName, actual, c.ExpectedValue)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_SetSecret(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    KfDef\n\t\tSecret   Secret\n\t\tExpected KfDef\n\t}\n\n\tcases := []testCase{\n\t\t// No Secrets exist\n\t\t{\n\t\t\tInput: KfDef{},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Override a secret\n\t\t{\n\t\t\tInput: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"oldvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\ti := &KfDef{}\n\t\t*i = c.Input\n\t\ti.SetSecret(c.Secret)\n\n\t\tif !reflect.DeepEqual(*i, c.Expected) {\n\t\t\tpGot, _ := Pformat(i)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting secret %v; got;\\n%v\\nwant;\\n%v\", c.Secret.Name, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc Test_DeleteApplication(t *testing.T) {\n\ttype testCase struct {\n\t\tFilename      string\n\t\tDeleteAppName string\n\t\tExpected      []Application\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tFilename:      \"kfctl_plugin_test.yaml\",\n\t\t\tDeleteAppName: \"delete\",\n\t\t\tExpected: []Application{\n\t\t\t\t{\n\t\t\t\t\tName: \"keep\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Filename)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\n\t\tlog.Infof(\"Want \")\n\t\td := &KfDef{}\n\t\terr := yaml.Unmarshal(buf, d)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not parse as KfDef error %v\", err)\n\t\t}\n\n\t\td.DeleteApplication(c.DeleteAppName)\n\t\tif !reflect.DeepEqual(d.Spec.Applications, c.Expected) {\n\t\t\tpGot, _ := Pformat(d.Spec.Applications)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error deleting applicaitons got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\n// Pformat returns a pretty format output of any value.\nfunc Pformat(value interface{}) (string, error) {\n\tif s, ok := value.(string); ok {\n\t\treturn s, nil\n\t}\n\tvalueJson, err := json.MarshalIndent(value, \"\", \"  \")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(valueJson), nil\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1 contains API Schema definitions for the kfdef v1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\n\npackage v1\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1 contains API Schema definitions for the kfdef v1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\npackage v1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"kfdef.apps.kubeflow.org\", Version: \"v1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfDef{},\n\t\t&KfDefList{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/testdata/doc.go",
    "content": "package testdata\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/testdata/kfctl_plugin_test.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1\nkind: KfDef\nspec:\n  applications:\n  - name: delete\n  - name: keep\n  plugins:\n  - kind: fakeplugin\n    spec:\n      param: someparam\n      boolParam: true\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage v1\n\nimport (\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Application) DeepCopyInto(out *Application) {\n\t*out = *in\n\tif in.KustomizeConfig != nil {\n\t\tin, out := &in.KustomizeConfig, &out.KustomizeConfig\n\t\t*out = new(KustomizeConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Application.\nfunc (in *Application) DeepCopy() *Application {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Application)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *EnvSource) DeepCopyInto(out *EnvSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvSource.\nfunc (in *EnvSource) DeepCopy() *EnvSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(EnvSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDef) DeepCopyInto(out *KfDef) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDef.\nfunc (in *KfDef) DeepCopy() *KfDef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfDef) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefCondition) DeepCopyInto(out *KfDefCondition) {\n\t*out = *in\n\tin.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)\n\tin.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefCondition.\nfunc (in *KfDefCondition) DeepCopy() *KfDefCondition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefCondition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefList) DeepCopyInto(out *KfDefList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]KfDef, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefList.\nfunc (in *KfDefList) DeepCopy() *KfDefList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfDefList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefSpec) DeepCopyInto(out *KfDefSpec) {\n\t*out = *in\n\tif in.Applications != nil {\n\t\tin, out := &in.Applications, &out.Applications\n\t\t*out = make([]Application, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Plugins != nil {\n\t\tin, out := &in.Plugins, &out.Plugins\n\t\t*out = make([]Plugin, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Secrets != nil {\n\t\tin, out := &in.Secrets, &out.Secrets\n\t\t*out = make([]Secret, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Repos != nil {\n\t\tin, out := &in.Repos, &out.Repos\n\t\t*out = make([]Repo, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefSpec.\nfunc (in *KfDefSpec) DeepCopy() *KfDefSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefStatus) DeepCopyInto(out *KfDefStatus) {\n\t*out = *in\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]KfDefCondition, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.ReposCache != nil {\n\t\tin, out := &in.ReposCache, &out.ReposCache\n\t\t*out = make([]RepoCache, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefStatus.\nfunc (in *KfDefStatus) DeepCopy() *KfDefStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KustomizeConfig) DeepCopyInto(out *KustomizeConfig) {\n\t*out = *in\n\tif in.RepoRef != nil {\n\t\tin, out := &in.RepoRef, &out.RepoRef\n\t\t*out = new(RepoRef)\n\t\t**out = **in\n\t}\n\tif in.Overlays != nil {\n\t\tin, out := &in.Overlays, &out.Overlays\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Parameters != nil {\n\t\tin, out := &in.Parameters, &out.Parameters\n\t\t*out = make([]NameValue, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KustomizeConfig.\nfunc (in *KustomizeConfig) DeepCopy() *KustomizeConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KustomizeConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *LiteralSource) DeepCopyInto(out *LiteralSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LiteralSource.\nfunc (in *LiteralSource) DeepCopy() *LiteralSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(LiteralSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *NameValue) DeepCopyInto(out *NameValue) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NameValue.\nfunc (in *NameValue) DeepCopy() *NameValue {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(NameValue)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Plugin) DeepCopyInto(out *Plugin) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tif in.Spec != nil {\n\t\tin, out := &in.Spec, &out.Spec\n\t\t*out = new(runtime.RawExtension)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Plugin.\nfunc (in *Plugin) DeepCopy() *Plugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Plugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Repo) DeepCopyInto(out *Repo) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Repo.\nfunc (in *Repo) DeepCopy() *Repo {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Repo)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoCache) DeepCopyInto(out *RepoCache) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoCache.\nfunc (in *RepoCache) DeepCopy() *RepoCache {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoCache)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoRef) DeepCopyInto(out *RepoRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoRef.\nfunc (in *RepoRef) DeepCopy() *RepoRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Secret) DeepCopyInto(out *Secret) {\n\t*out = *in\n\tif in.SecretSource != nil {\n\t\tin, out := &in.SecretSource, &out.SecretSource\n\t\t*out = new(SecretSource)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Secret.\nfunc (in *Secret) DeepCopy() *Secret {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Secret)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretRef) DeepCopyInto(out *SecretRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretRef.\nfunc (in *SecretRef) DeepCopy() *SecretRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretSource) DeepCopyInto(out *SecretSource) {\n\t*out = *in\n\tif in.LiteralSource != nil {\n\t\tin, out := &in.LiteralSource, &out.LiteralSource\n\t\t*out = new(LiteralSource)\n\t\t**out = **in\n\t}\n\tif in.EnvSource != nil {\n\t\tin, out := &in.EnvSource, &out.EnvSource\n\t\t*out = new(EnvSource)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretSource.\nfunc (in *SecretSource) DeepCopy() *SecretSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/application_types.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1alpha1\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\tnetUrl \"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/ghodss/yaml\"\n\tgogetter \"github.com/hashicorp/go-getter\"\n\t\"github.com/hashicorp/go-getter/helper/url\"\n\t\"github.com/kubeflow/kfctl/v3/config\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\tv1 \"k8s.io/api/core/v1\"\n\tvalid \"k8s.io/apimachinery/pkg/api/validation\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// KfDefSpec holds common attributes used by each platform\ntype KfDefSpec struct {\n\tconfig.ComponentConfig `json:\",inline\"`\n\t// TODO(jlewi): Why is AppDir a part of the spec? AppDir is currently used\n\t// to refer to the location on disk where all the manifests are stored.\n\t// But that should be treated as a local cache and not part of the spec.\n\t// For example, if the app is checked out on a different machine the AppDir will change.\n\t// AppDir. AppDir is stored in KfDefSpec because we pass a KfDef around to\n\t// as a way to pass the information to all the KfApps that need to know the local AppDir.\n\t// A better solution might be to store AppDir in KfDef.Status to better reflect its\n\t// ephemeral nature and match K8s semantics.\n\tAppDir     string `json:\"appdir,omitempty\"`\n\tVersion    string `json:\"version,omitempty\"`\n\tMountLocal bool   `json:\"mountLocal,omitempty\"`\n\n\t// TODO(jlewi): Project, Email, IpName, Hostname, Zone and other\n\t// GCP specific values should be moved into GCP plugin.\n\tProject            string   `json:\"project,omitempty\"`\n\tEmail              string   `json:\"email,omitempty\"`\n\tIpName             string   `json:\"ipName,omitempty\"`\n\tHostname           string   `json:\"hostname,omitempty\"`\n\tZone               string   `json:\"zone,omitempty\"`\n\tUseBasicAuth       bool     `json:\"useBasicAuth\"`\n\tSkipInitProject    bool     `json:\"skipInitProject,omitempty\"`\n\tUseIstio           bool     `json:\"useIstio\"`\n\tEnableApplications bool     `json:\"enableApplications\"`\n\tServerVersion      string   `json:\"serverVersion,omitempty\"`\n\tDeleteStorage      bool     `json:\"deleteStorage,omitempty\"`\n\tPackageManager     string   `json:\"packageManager,omitempty\"`\n\tRepos              []Repo   `json:\"repos,omitempty\"`\n\tSecrets            []Secret `json:\"secrets,omitempty\"`\n\tPlugins            []Plugin `json:\"plugins,omitempty\"`\n\n\t// Applications defines a list of applications to install\n\tApplications []Application `json:\"applications,omitempty\"`\n}\n\nvar DefaultRegistry = RegistryConfig{\n\tName: \"kubeflow\",\n\tRepo: \"https://github.com/kubeflow/kubeflow.git\",\n\tPath: \"kubeflow\",\n}\n\n// Application defines an application to install\ntype Application struct {\n\tName            string           `json:\"name,omitempty\"`\n\tKustomizeConfig *KustomizeConfig `json:\"kustomizeConfig,omitempty\"`\n}\n\ntype KustomizeConfig struct {\n\tRepoRef    *RepoRef           `json:\"repoRef,omitempty\"`\n\tOverlays   []string           `json:\"overlays,omitempty\"`\n\tParameters []config.NameValue `json:\"parameters,omitempty\"`\n}\n\ntype RepoRef struct {\n\tName string `json:\"name,omitempty\"`\n\tPath string `json:\"path,omitempty\"`\n}\n\n// Plugin can be used to customize the generation and deployment of Kubeflow\n// TODO(jlewi): Should Plugin contain K8s TypeMeta so that we can use ApiVersion and Kind\n// to identify what it refers to?\ntype Plugin struct {\n\tName string `json:\"name,omitempty\"`\n\t// TODO(jlewi): Should we be using runtime.Object or runtime.RawExtension\n\tSpec *runtime.RawExtension `json:\"spec,omitempty\"`\n}\n\n// SecretRef is a reference to a secret\ntype SecretRef struct {\n\t// Name of the secret\n\tName string `json:\"name,omitempty\"`\n}\n\n// Repo provides information about a repository providing config (e.g. kustomize packages,\n// Deployment manager configs, etc...)\ntype Repo struct {\n\t// Name is a name to identify the repository.\n\tName string `json:\"name,omitempty\"`\n\t// URI where repository can be obtained.\n\t// Can use any URI understood by go-getter:\n\t// https://github.com/hashicorp/go-getter/blob/master/README.md#installation-and-usage\n\tUri string `json:\"uri,omitempty\"`\n\n\t// Root is the relative path to use as the root.\n\t// TODO(jlewi): Get rid of this field. SyncCache now takes care of setting the directory\n\t// as needed.\n\tRoot string `json:\"root,omitempty\"`\n}\n\n// Secret provides information about secrets needed to configure Kubeflow.\n// Secrets can be provided via references e.g. a URI so that they won't\n// be serialized as part of the KfDefSpec which is intended to be written into source control.\ntype Secret struct {\n\tName         string        `json:\"name,omitempty\"`\n\tSecretSource *SecretSource `json:\"secretSource,omitempty\"`\n}\n\ntype SecretSource struct {\n\tLiteralSource *LiteralSource `json:\"literalSource,omitempty\"`\n\tHashedSource  *HashedSource  `json:\"hashedSource,omitempty\"`\n\tEnvSource     *EnvSource     `json:\"envSource,omitempty\"`\n}\n\ntype LiteralSource struct {\n\tValue string `json:\"value,omitempty\"`\n}\n\ntype HashedSource struct {\n\tHashedValue string `json:\"value,omitempty\"`\n}\n\ntype EnvSource struct {\n\tName string `json:\"Name,omitempty\"`\n}\n\n// RegistryConfig is used for two purposes:\n// 1. used during image build, to configure registries that should be baked into the bootstrapper docker image.\n//  (See: https://github.com/kubeflow/kubeflow/blob/master/bootstrap/image_registries.yaml)\n// 2. used during app create rpc call, specifies a registry to be added to an app.\n//      required info for registry: Name, Repo, Version, Path\n//  Additionally if any of required fields is blank we will try to map with one of\n//  the registries baked into the Docker image using the name.\ntype RegistryConfig struct {\n\tName    string `json:\"name,omitempty\"`\n\tRepo    string `json:\"repo,omitempty\"`\n\tVersion string `json:\"version,omitempty\"`\n\tPath    string `json:\"path,omitempty\"`\n\tRegUri  string `json:\"reguri,omitempty\"`\n}\n\ntype KsComponent struct {\n\tName      string `json:\"name,omitempty\"`\n\tPrototype string `json:\"prototype,omitempty\"`\n}\n\ntype KsLibrary struct {\n\tName     string `json:\"name\"`\n\tRegistry string `json:\"registry\"`\n\tVersion  string `json:\"version\"`\n}\n\ntype KsParameter struct {\n\t// nested components are referenced as \"a.b.c\" where \"a\" or \"b\" may be a module name\n\tComponent string `json:\"component,omitempty\"`\n\tName      string `json:\"name,omitempty\"`\n\tValue     string `json:\"value,omitempty\"`\n}\n\ntype KsModule struct {\n\tName       string         `json:\"name\"`\n\tComponents []*KsComponent `json:\"components,omitempty\"`\n\tModules    []*KsModule    `json:\"modules,omitempty\"`\n}\n\ntype KsPackage struct {\n\tName string `json:\"name,omitempty\"`\n\t// Registry should be the name of the registry containing the package.\n\tRegistry string `json:\"registry,omitempty\"`\n}\n\ntype Registry struct {\n\t// Name is the user defined name of a registry.\n\tName string `json:\"-\"`\n\t// Protocol is the registry protocol for this registry. Currently supported\n\t// values are `github`, `fs`, `helm`.\n\tProtocol string `json:\"protocol\"`\n\t// URI is the location of the registry.\n\tURI string `json:\"uri\"`\n}\n\ntype LibrarySpec struct {\n\tVersion string\n\tPath    string\n}\n\n// KsRegistry corresponds to ksonnet.io/registry\n// which is the registry.yaml file found in every registry.\ntype KsRegistry struct {\n\tApiVersion string\n\tKind       string\n\tLibraries  map[string]LibrarySpec\n}\n\n// RegistriesConfigFile corresponds to a YAML file specifying information\n// about known registries.\ntype RegistriesConfigFile struct {\n\t// Registries provides information about known registries.\n\tRegistries []*RegistryConfig\n}\n\ntype AppConfig struct {\n\tRegistries []*RegistryConfig `json:\"registries,omitempty\"`\n\tPackages   []KsPackage       `json:\"packages,omitempty\"`\n\tComponents []KsComponent     `json:\"components,omitempty\"`\n\tParameters []KsParameter     `json:\"parameters,omitempty\"`\n\t// Parameters to apply when creating the ksonnet components\n\tApplyParameters []KsParameter `json:\"applyParameters,omitempty\"`\n}\n\n// KfDefStatus defines the observed state of KfDef\ntype KfDefStatus struct {\n\tConditions []KfDefCondition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,6,rep,name=conditions\"`\n\t// ReposCache is used to cache information about local caching of the URIs.\n\tReposCache map[string]RepoCache `json:\"reposCache,omitempty\"`\n}\n\ntype RepoCache struct {\n\tLocalPath string `json:\"localPath,string\"`\n}\n\ntype KfDefConditionType string\n\nconst (\n\t// KfCreated means the KfDef spec has been created.\n\tKfCreated KfDefConditionType = \"Created\"\n\n\t// KfDeploying means Kubeflow is in the process of being deployed.\n\tKfDeploying KfDefConditionType = \"Deploying\"\n\n\t// KfSucceeded means Kubeflow was successfully deployed.\n\tKfSucceeded KfDefConditionType = \"Succeeded\"\n\n\t// KfFailed meansthere was a problem deploying Kubeflow.\n\tKfFailed KfDefConditionType = \"Failed\"\n\n\t// Reasons for conditions\n\n\t// InvalidKfDefSpecReason indicates the KfDef was not valid.\n\tInvalidKfDefSpecReason = \"InvalidKfDefSpec\"\n)\n\ntype KfDefCondition struct {\n\t// Type of deployment condition.\n\tType KfDefConditionType `json:\"type\" protobuf:\"bytes,1,opt,name=type,casttype=KfDefConditionType\"`\n\t// Status of the condition, one of True, False, Unknown.\n\tStatus v1.ConditionStatus `json:\"status\" protobuf:\"bytes,2,opt,name=status,casttype=k8s.io/api/core/v1.ConditionStatus\"`\n\t// The last time this condition was updated.\n\tLastUpdateTime metav1.Time `json:\"lastUpdateTime,omitempty\" protobuf:\"bytes,6,opt,name=lastUpdateTime\"`\n\t// Last time the condition transitioned from one status to another.\n\tLastTransitionTime metav1.Time `json:\"lastTransitionTime,omitempty\" protobuf:\"bytes,7,opt,name=lastTransitionTime\"`\n\t// The reason for the condition's last transition.\n\tReason string `json:\"reason,omitempty\" protobuf:\"bytes,4,opt,name=reason\"`\n\t// A human readable message indicating details about the transition.\n\tMessage string `json:\"message,omitempty\" protobuf:\"bytes,5,opt,name=message\"`\n}\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfDef is the Schema for the applications API\n// +k8s:openapi-gen=true\ntype KfDef struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   KfDefSpec   `json:\"spec,omitempty\"`\n\tStatus KfDefStatus `json:\"status,omitempty\"`\n}\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfDefList contains a list of KfDef\ntype KfDefList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []KfDef `json:\"items\"`\n}\n\n// GetDefaultRegistry return reference of a newly copied Default Registry\nfunc GetDefaultRegistry() *RegistryConfig {\n\tnewReg := DefaultRegistry\n\treturn &newReg\n}\n\nconst DefaultCacheDir = \".cache\"\n\nfunc isValidUrl(toTest string) bool {\n\t_, err := netUrl.ParseRequestURI(toTest)\n\tif err != nil {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}\n}\n\n// TODO: THIS FUNCTION IS DEPRECATED. PLEASE USE `LoadKFDefFromURI` in kfloader.go\n// LoadKFDefFromURI constructs a KfDef given the path to a YAML file\n// specifying a YAML config file.\n// configFile is the path to the YAML file containing the KfDef spec. Can be any URI supported by hashicorp\n// go-getter.\nfunc LoadKFDefFromURI(configFile string) (*KfDef, error) {\n\tif configFile == \"\" {\n\t\treturn nil, fmt.Errorf(\"config file must be the URI of a KfDef spec\")\n\t}\n\n\t// TODO(jlewi): We should check if configFile doesn't specify a protocol or the protocol\n\t// is file:// then we can just read it rather than fetching with go-getter.\n\tappDir, err := ioutil.TempDir(\"\", \"\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Create a temporary directory to copy the file to.\")\n\t}\n\t// Open config file\n\t//\n\t// TODO(jlewi): Should we use hashicorp go-getter.GetAny here? We use that to download\n\t// the tarballs for the repos. Maybe we should use that here as well to be consistent.\n\tappFile := path.Join(appDir, \"tmp_app.yaml\")\n\tlog.Infof(\"Downloading %v to %v\", configFile, appFile)\n\tconfigFileUri, err := netUrl.Parse(configFile)\n\tif err != nil {\n\t\tlog.Errorf(\"Could not parse configFile url\")\n\t}\n\tif isValidUrl(configFile) {\n\t\terrGet := gogetter.GetFile(appFile, configFile)\n\t\tif errGet != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"could not fetch specified config %s: %v\", configFile, err),\n\t\t\t}\n\t\t}\n\t} else {\n\t\tg := new(gogetter.FileGetter)\n\t\tg.Copy = true\n\t\terrGet := g.GetFile(appFile, configFileUri)\n\t\tif errGet != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"could not fetch specified config %s: %v\", configFile, err),\n\t\t\t}\n\t\t}\n\t}\n\n\t// Read contents\n\tconfigFileBytes, err := ioutil.ReadFile(appFile)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not read from config file %s: %v\", configFile, err),\n\t\t}\n\t}\n\t// Unmarshal content onto KfDef struct\n\tkfDef := &KfDef{}\n\tif err := yaml.Unmarshal(configFileBytes, kfDef); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not unmarshal config file onto KfDef struct: %v\", err),\n\t\t}\n\t}\n\n\treturn kfDef, nil\n}\n\n// SyncCache will synchronize the local cache of any repositories.\n// On success the status is updated with pointers to the cache.\n//\n// TODO(jlewi): I'm not sure this handles head references correctly.\n// e.g. suppose we have a URI like\n// https://github.com/kubeflow/manifests/tarball/pull/189/head?archive=tar.gz\n// This gets unpacked to: kubeflow-manifests-e2c1bcb where e2c1bcb is the commit.\n// I don't think the code is currently setting the local directory for the cache correctly in\n// that case.\n//\n//\n// Using tarball vs. archive in github links affects the download path\n// e.g.\n// https://github.com/kubeflow/manifests/tarball/master?archive=tar.gz\n//    unpacks to  kubeflow-manifests-${COMMIT}\n// https://github.com/kubeflow/manifests/archive/master.tar.gz\n//    unpacks to manifests-master\n// Always use archive format so that the path is predetermined.\n//\n// Instructions: https://github.com/hashicorp/go-getter#protocol-specific-options\n//\n// What is the correct syntax for downloading pull requests?\n// The following doesn't seem to work\n// https://github.com/kubeflow/manifests/archive/master.tar.gz?ref=pull/188\n//   * Appears to download master\n//\n// This appears to work\n// https://github.com/kubeflow/manifests/tarball/pull/188/head?archive=tar.gz\n// But unpacks it into\n// kubeflow-manifests-${COMMIT}\n//\nfunc (d *KfDef) SyncCache() error {\n\tif d.Spec.AppDir == \"\" {\n\t\treturn fmt.Errorf(\"AppDir must be specified\")\n\t}\n\n\tif d.Status.ReposCache == nil {\n\t\td.Status.ReposCache = make(map[string]RepoCache)\n\t}\n\tappDir := d.Spec.AppDir\n\t// Loop over all the repos and download them.\n\t// TODO(https://github.com/kubeflow/kubeflow/issues/3545): We should check if we already have a local copy and\n\t// not redownload it.\n\n\tbaseCacheDir := path.Join(appDir, DefaultCacheDir)\n\tif _, err := os.Stat(baseCacheDir); os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating directory %v\", baseCacheDir)\n\t\tappdirErr := os.MkdirAll(baseCacheDir, os.ModePerm)\n\t\tif appdirErr != nil {\n\t\t\tlog.Errorf(\"Couldn't create directory %v: %v\", baseCacheDir, appdirErr)\n\t\t\treturn appdirErr\n\t\t}\n\t}\n\n\tfor _, r := range d.Spec.Repos {\n\t\tcacheDir := path.Join(baseCacheDir, r.Name)\n\n\t\t// Can we use a checksum or other mechanism to verify if the existing location is good?\n\t\t// If there was a problem the first time around then removing it might provide a way to recover.\n\t\tif _, err := os.Stat(cacheDir); err == nil {\n\t\t\tif _, ok := d.Status.ReposCache[r.Name]; ok && d.Status.ReposCache[r.Name].LocalPath != \"\" {\n\t\t\t\tlog.Infof(\"%v exists; not resyncing \", cacheDir)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlog.Infof(\"Deleting cachedir %v because Status.ReposCache is out of date\", cacheDir)\n\n\t\t\t// TODO(jlewi): The reason the cachedir might exist but not be stored in KfDef.status\n\t\t\t// is because of a backwards compatibility path in which we download the cache to construct\n\t\t\t// the KfDef. Specifically coordinator.CreateKfDefFromOptions is calling kftypes.DownloadFromCache\n\t\t\t// We don't want to rely on that method to set the cache because we have logic\n\t\t\t// below to set LocalPath that we don't want to duplicate.\n\t\t\t// Unfortunately this means we end up fetching the repo twice which is very inefficient.\n\t\t\tif err := os.RemoveAll(cacheDir); err != nil {\n\t\t\t\tlog.Errorf(\"There was a problem deleting directory %v; error %v\", cacheDir, err)\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t}\n\n\t\tu, err := url.Parse(r.Uri)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not parse URI %v; error %v\", r.Uri, err)\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tlog.Infof(\"Fetching %v to %v\", r.Uri, cacheDir)\n\t\ttarballUrlErr := gogetter.GetAny(cacheDir, r.Uri)\n\t\tif tarballUrlErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"couldn't download URI %v: %v\", r.Uri, tarballUrlErr),\n\t\t\t}\n\t\t}\n\n\t\t// This is a bit of a hack to deal with the fact that GitHub tarballs\n\t\t// can unpack to a directory containing the commit.\n\t\tlocalPath := cacheDir\n\t\tif u.Scheme == \"http\" || u.Scheme == \"https\" {\n\t\t\tfiles, filesErr := ioutil.ReadDir(cacheDir)\n\t\t\tif filesErr != nil {\n\t\t\t\tlog.Errorf(\"Error reading cachedir; error %v\", filesErr)\n\t\t\t\treturn errors.WithStack(filesErr)\n\t\t\t}\n\t\t\tsubdir := files[0].Name()\n\t\t\tlocalPath = path.Join(cacheDir, subdir)\n\t\t}\n\n\t\td.Status.ReposCache[r.Name] = RepoCache{\n\t\t\tLocalPath: localPath,\n\t\t}\n\n\t\tlog.Infof(\"Fetch succeeded; LocalPath %v\", d.Status.ReposCache[r.Name].LocalPath)\n\t}\n\treturn nil\n}\n\n// GetSecret returns the specified secret or an error if the secret isn't specified.\nfunc (d *KfDef) GetSecret(name string) (string, error) {\n\tfor _, s := range d.Spec.Secrets {\n\t\tif s.Name != name {\n\t\t\tcontinue\n\t\t}\n\t\tif s.SecretSource.LiteralSource != nil {\n\t\t\treturn s.SecretSource.LiteralSource.Value, nil\n\t\t}\n\t\tif s.SecretSource.HashedSource != nil {\n\t\t\treturn s.SecretSource.HashedSource.HashedValue, nil\n\t\t}\n\t\tif s.SecretSource.EnvSource != nil {\n\t\t\treturn os.Getenv(s.SecretSource.EnvSource.Name), nil\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"No secret source provided for secret %v\", name)\n\t}\n\treturn \"\", NewSecretNotFound(name)\n}\n\n// SetSecret sets the specified secret; if a secret with the given name already exists it is overwritten.\nfunc (d *KfDef) SetSecret(newSecret Secret) {\n\tfor i, s := range d.Spec.Secrets {\n\t\tif s.Name == newSecret.Name {\n\t\t\td.Spec.Secrets[i] = newSecret\n\t\t\treturn\n\t\t}\n\t}\n\n\td.Spec.Secrets = append(d.Spec.Secrets, newSecret)\n}\n\n// GetPluginSpec will try to unmarshal the spec for the specified plugin to the supplied\n// interface. Returns an error if the plugin isn't defined or if there is a problem\n// unmarshaling it.\nfunc (d *KfDef) GetPluginSpec(pluginName string, s interface{}) error {\n\tfor _, p := range d.Spec.Plugins {\n\t\tif p.Name != pluginName {\n\t\t\tcontinue\n\t\t}\n\n\t\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t\t// and then unserialize it.\n\t\tspecBytes, err := yaml.Marshal(p.Spec)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not marshal plugin %v args; error %v\", pluginName, err)\n\t\t\treturn err\n\t\t}\n\n\t\terr = yaml.Unmarshal(specBytes, s)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not unmarshal plugin %v to the provided type; error %v\", pluginName, err)\n\t\t}\n\t\treturn nil\n\t}\n\n\treturn NewPluginNotFound(pluginName)\n}\n\n// SetPluginSpec sets the requested parameter. The plugin is added if it doesn't already exist.\nfunc (d *KfDef) SetPluginSpec(pluginName string, spec interface{}) error {\n\t// Convert spec to RawExtension\n\n\tr := &runtime.RawExtension{}\n\n\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t// and then unserialize it.\n\tspecBytes, err := yaml.Marshal(spec)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not marshal spec; error %v\", err)\n\t\treturn err\n\t}\n\n\terr = yaml.Unmarshal(specBytes, r)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not unmarshal plugin to RawExtension; error %v\", err)\n\t}\n\n\tindex := -1\n\n\tfor i, p := range d.Spec.Plugins {\n\t\tif p.Name == pluginName {\n\t\t\tindex = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif index == -1 {\n\t\t// Plugin in doesn't exist so add it\n\t\tlog.Infof(\"Adding plugin %v\", pluginName)\n\n\t\td.Spec.Plugins = append(d.Spec.Plugins, Plugin{\n\t\t\tName: pluginName,\n\t\t})\n\n\t\tindex = len(d.Spec.Plugins) - 1\n\t}\n\n\td.Spec.Plugins[index].Spec = r\n\treturn nil\n}\n\n// IsValid returns true if the spec is a valid and complete spec.\n// If false it will also return a string providing a message about why its invalid.\nfunc (d *KfDef) IsValid() (bool, string) {\n\t// TODO(jlewi): Add more validation and a unittest.\n\t// Validate kfDef\n\terrs := valid.NameIsDNSLabel(d.Name, false)\n\tif errs != nil && len(errs) > 0 {\n\t\treturn false, fmt.Sprintf(\"invalid name due to %v\", strings.Join(errs, \",\"))\n\t}\n\n\t// PackageManager is currently required because we will try to load the package manager and get an error if\n\t// none is specified.\n\tif d.Spec.PackageManager == \"\" {\n\t\treturn false, fmt.Sprintf(\"KfDef.Spec.PackageManager is required\")\n\t}\n\n\treturn true, \"\"\n}\n\n// WriteToFile write the KfDef to a file.\n// WriteToFile will strip out any literal secrets before writing it\nfunc (d *KfDef) WriteToFile(path string) error {\n\tstripped := d.DeepCopy()\n\n\tsecrets := make([]Secret, 0)\n\n\tfor _, s := range stripped.Spec.Secrets {\n\t\tif s.SecretSource.LiteralSource != nil {\n\t\t\tlog.Warnf(\"Stripping literal secret %v from KfDef before serializing it\", s.Name)\n\t\t\tcontinue\n\t\t}\n\t\tsecrets = append(secrets, s)\n\t}\n\n\tstripped.Spec.Secrets = secrets\n\n\t// Rewrite app.yaml\n\tbuf, bufErr := yaml.Marshal(stripped)\n\tif bufErr != nil {\n\t\tlog.Errorf(\"Error marshaling kfdev; %v\", bufErr)\n\t\treturn bufErr\n\t}\n\tlog.Infof(\"Writing stripped KfDef to %v\", path)\n\treturn ioutil.WriteFile(path, buf, 0644)\n}\n\ntype PluginNotFound struct {\n\tName string\n}\n\nfunc (e *PluginNotFound) Error() string {\n\treturn fmt.Sprintf(\"Missing plugin %v\", e.Name)\n}\n\nfunc NewPluginNotFound(n string) *PluginNotFound {\n\treturn &PluginNotFound{\n\t\tName: n,\n\t}\n}\n\nfunc IsPluginNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\t_, ok := e.(*PluginNotFound)\n\treturn ok\n}\n\ntype SecretNotFound struct {\n\tName string\n}\n\nfunc (e *SecretNotFound) Error() string {\n\treturn fmt.Sprintf(\"Missing secret %v\", e.Name)\n}\n\nfunc NewSecretNotFound(n string) *SecretNotFound {\n\treturn &SecretNotFound{\n\t\tName: n,\n\t}\n}\n\nfunc IsSecretNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\t_, ok := e.(*SecretNotFound)\n\treturn ok\n}\n\nfunc getParameter(parameters []config.NameValue, paramName string) (string, bool) {\n\tfor _, p := range parameters {\n\t\tif p.Name == paramName {\n\t\t\treturn p.Value, true\n\t\t}\n\t}\n\n\treturn \"\", false\n}\n\nfunc setParameter(parameters []config.NameValue, paramName string, value string) []config.NameValue {\n\tpIndex := -1\n\n\tfor i, p := range parameters {\n\t\tif p.Name == paramName {\n\t\t\tpIndex = i\n\t\t}\n\t}\n\n\tif pIndex < 0 {\n\t\tparameters = append(parameters, config.NameValue{})\n\t\tpIndex = len(parameters) - 1\n\t}\n\n\tparameters[pIndex].Name = paramName\n\tparameters[pIndex].Value = value\n\n\treturn parameters\n}\n\ntype AppNotFound struct {\n\tName string\n}\n\nfunc (e *AppNotFound) Error() string {\n\treturn fmt.Sprintf(\"Application %v is missing\", e.Name)\n}\n\nfunc IsAppNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\t_, ok := e.(*AppNotFound)\n\treturn ok\n}\n\n// GetApplicationParameter gets the desired application parameter.\nfunc (d *KfDef) GetApplicationParameter(appName string, paramName string) (string, bool) {\n\t// First we check applications for an application with the specified name.\n\tif d.Spec.Applications != nil {\n\t\tfor _, a := range d.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\treturn getParameter(a.KustomizeConfig.Parameters, paramName)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Since an application with the specified name wasn't found check the deprecated componentParams\n\tif _, ok := d.Spec.ComponentParams[appName]; ok {\n\t\treturn getParameter(d.Spec.ComponentParams[appName], paramName)\n\t}\n\n\treturn \"\", false\n}\n\n// SetApplicationParameter sets the desired application parameter.\nfunc (d *KfDef) SetApplicationParameter(appName string, paramName string, value string) error {\n\t// First we check applications for an application with the specified name.\n\tif d.Spec.Applications != nil {\n\t\tappIndex := -1\n\t\tfor i, a := range d.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\tappIndex = i\n\t\t\t}\n\t\t}\n\n\t\tif appIndex >= 0 {\n\n\t\t\tif d.Spec.Applications[appIndex].KustomizeConfig == nil {\n\t\t\t\treturn errors.WithStack(fmt.Errorf(\"Application %v doesn't have KustomizeConfig\", appName))\n\t\t\t}\n\n\t\t\td.Spec.Applications[appIndex].KustomizeConfig.Parameters = setParameter(\n\t\t\t\td.Spec.Applications[appIndex].KustomizeConfig.Parameters, paramName, value)\n\n\t\t\treturn nil\n\t\t}\n\t}\n\n\t// Since an application with the specified name wasn't found check the deprecated componentParams\n\tif _, ok := d.Spec.ComponentParams[appName]; ok {\n\t\td.Spec.ComponentParams[appName] = setParameter(d.Spec.ComponentParams[appName], paramName, value)\n\t\treturn nil\n\t}\n\n\treturn &AppNotFound{Name: appName}\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/application_types_test.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1alpha1\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/kubeflow/kfctl/v3/config\"\n\t\"github.com/prometheus/common/log\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"reflect\"\n\t\"testing\"\n)\n\n// TODO(https://github.com/kubeflow/kubeflow/issues/3056): Fix the test and uncomment.\n//import (\n//\t\"testing\"\n//\n//\t\"github.com/onsi/gomega\"\n//\t\"golang.org/x/net/context\"\n//\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n//\t\"k8s.io/apimachinery/pkg/types\"\n//)\n//\n//func TestStorageApplication(t *testing.T) {\n//\tkey := types.NamespacedName{\n//\t\tName:      \"foo\",\n//\t\tNamespace: \"default\",\n//\t}\n//\tcreated := &KfDef{\n//\t\tObjectMeta: metav1.ObjectMeta{\n//\t\t\tName:      \"foo\",\n//\t\t\tNamespace: \"default\",\n//\t\t}}\n//\tg := gomega.NewGomegaWithT(t)\n//\n//\t// Test Create\n//\tfetched := &KfDef{}\n//\tg.Expect(c.Create(context.TODO(), created)).NotTo(gomega.HaveOccurred())\n//\n//\tg.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())\n//\tg.Expect(fetched).To(gomega.Equal(created))\n//\n//\t// Test Updating the Labels\n//\tupdated := fetched.DeepCopy()\n//\tupdated.Labels = map[string]string{\"hello\": \"world\"}\n//\tg.Expect(c.Update(context.TODO(), updated)).NotTo(gomega.HaveOccurred())\n//\n//\tg.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())\n//\tg.Expect(fetched).To(gomega.Equal(updated))\n//\n//\t// Test Delete\n//\tg.Expect(c.Delete(context.TODO(), fetched)).NotTo(gomega.HaveOccurred())\n//\tg.Expect(c.Get(context.TODO(), key, fetched)).To(gomega.HaveOccurred())\n//}\n\n// TODO(jlewi): We should add a unittest for the case where Status.ReposCache\n// points to some incorrect locations but the actual cache dir exists and is correct.\nfunc TestSyncCache(t *testing.T) {\n\ttype testCase struct {\n\t\tinput    *KfDef\n\t\texpected map[string]RepoCache\n\t}\n\n\t// Verify that we can sync some files.\n\ttestDir, _ := ioutil.TempDir(\"\", \"\")\n\n\tsrcDir := path.Join(testDir, \"src\")\n\terr := os.Mkdir(srcDir, os.ModePerm)\n\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create directoy; %v\", err)\n\t}\n\n\tioutil.WriteFile(path.Join(srcDir, \"file1\"), []byte(\"hello world\"), os.ModePerm)\n\n\trepoName := \"testRepo\"\n\n\ttestCases := []testCase{\n\t\t{\n\t\t\tinput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tAppDir: path.Join(testDir, \"app1\"),\n\t\t\t\t\tRepos: []Repo{{\n\t\t\t\t\t\tName: repoName,\n\t\t\t\t\t\tUri:  srcDir,\n\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: map[string]RepoCache{\n\t\t\t\trepoName: {\n\t\t\t\t\tLocalPath: path.Join(testDir, \"app1\", \".cache\", repoName),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// The following test cases pull from GitHub. The may be worth commenting\n\t\t// out in the unittests and only running manually\n\t\t//{\n\t\t//\tinput: &KfDef{\n\t\t//\t\tSpec: KfDefSpec{\n\t\t//\t\t\tAppDir: path.Join(testDir, \"app2\"),\n\t\t//\t\t\tRepos: []Repo{{\n\t\t//\t\t\t\tName: repoName,\n\t\t//\t\t\t\tUri:  \"https://github.com/kubeflow/manifests/archive/master.tar.gz\",\n\t\t//\t\t\t},\n\t\t//\t\t\t},\n\t\t//\t\t},\n\t\t//\t},\n\t\t//\texpected: map[string]RepoCache {\n\t\t//\t\trepoName: {\n\t\t//\t\t\tLocalPath: path.Join(testDir, \"app2\", \".cache\", repoName, \"manifests-master\"),\n\t\t//\t\t},\n\t\t//\t},\n\t\t//},\n\t\t//{\n\t\t//\tinput: &KfDef{\n\t\t//\t\tSpec: KfDefSpec{\n\t\t//\t\t\tAppDir: path.Join(testDir, \"app3\"),\n\t\t//\t\t\tRepos: []Repo{{\n\t\t//\t\t\t\tName: repoName,\n\t\t//\t\t\t\tUri:  \"https://github.com/kubeflow/manifests/tarball/pull/187/head?archive=tar.gz\",\n\t\t//\t\t\t},\n\t\t//\t\t\t},\n\t\t//\t\t},\n\t\t//\t},\n\t\t//\texpected: map[string]RepoCache {\n\t\t//\t\trepoName: {\n\t\t//\t\t\tLocalPath: path.Join(testDir, \"app3\", \".cache\", repoName, \"kubeflow-manifests-c04764b\"),\n\t\t//\t\t},\n\t\t//\t},\n\t\t//},\n\t}\n\n\tfor _, c := range testCases {\n\t\terr = c.input.SyncCache()\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not sync cache; %v\", err)\n\t\t}\n\n\t\tactual := c.input.Status.ReposCache[repoName].LocalPath\n\t\texpected := c.expected[repoName].LocalPath\n\t\tif actual != expected {\n\t\t\tt.Fatalf(\"LocalPath; got %v; want %v\", actual, expected)\n\t\t}\n\t}\n}\n\nfunc TestWriteKfDef(t *testing.T) {\n\t// Verify that if we write KfDef it will be stripped of any literal secrets.\n\ttype testCase struct {\n\t\tinput  *KfDef\n\t\toutput *KfDef\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tinput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tAppDir: \"someapp\",\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"somedata\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s2\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tEnvSource: &EnvSource{\n\t\t\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\toutput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tAppDir: \"someapp\",\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s2\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tEnvSource: &EnvSource{\n\t\t\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\ttestDir, _ := ioutil.TempDir(\"\", \"\")\n\n\t\ttestFile := path.Join(testDir, \"app.yaml\")\n\t\terr := c.input.WriteToFile(testFile)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not write file; %v\", err)\n\t\t}\n\n\t\t// Read contents\n\t\tconfigFileBytes, err := ioutil.ReadFile(testFile)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not read file; %v\", err)\n\t\t}\n\n\t\tresult := &KfDef{}\n\t\tif err := yaml.Unmarshal(configFileBytes, result); err != nil {\n\t\t\tt.Fatalf(\"Could not unmarshal the result; %v\", err)\n\t\t}\n\n\t\t// Test they are equal\n\t\tif !reflect.DeepEqual(result, c.output) {\n\t\t\tpExpected, _ := Pformat(c.output)\n\t\t\tpActual, _ := Pformat(result)\n\n\t\t\tt.Errorf(\"Result wasn't properly stripped: Got:\\n%v;\\n Want:\\n%v\", pActual, pExpected)\n\t\t}\n\t}\n}\n\ntype FakePluginSpec struct {\n\tParam     string `json:\"param,omitempty\"`\n\tBoolParam bool   `json:\"boolParam,omitempty\"`\n}\n\nfunc TestKfDef_GetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tFilename   string\n\t\tPluginName string\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tFilename:   \"kfctl_plugin_test.yaml\",\n\t\t\tPluginName: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"someparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Filename)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\n\t\tlog.Infof(\"Want \")\n\t\td := &KfDef{}\n\t\terr := yaml.Unmarshal(buf, d)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not parse as KfDef error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginName, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin spec got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_SetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tPluginName string\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tPluginName: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"oldparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Override the existing plugin\n\t\t{\n\t\t\tPluginName: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Add a new plugin\n\t\t{\n\t\t\tPluginName: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\td := &KfDef{}\n\n\tfor _, c := range cases {\n\t\terr := d.SetPluginSpec(c.PluginName, c.Expected)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not set plugin spec; error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginName, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin spec got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_GetSecret(t *testing.T) {\n\td := &KfDef{\n\t\tSpec: KfDefSpec{\n\t\t\tAppDir: \"someapp\",\n\t\t\tSecrets: []Secret{\n\t\t\t\t{\n\t\t\t\t\tName: \"s1\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\tValue: \"somedata\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"s2\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tEnvSource: &EnvSource{\n\t\t\t\t\t\t\tName: \"s2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\ttype testCase struct {\n\t\tSecretName    string\n\t\tExpectedValue string\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tSecretName:    \"s1\",\n\t\t\tExpectedValue: \"somedata\",\n\t\t},\n\t\t{\n\t\t\tSecretName:    \"s2\",\n\t\t\tExpectedValue: \"somesecret\",\n\t\t},\n\t}\n\n\tos.Setenv(\"s2\", \"somesecret\")\n\tfor _, c := range cases {\n\t\tactual, err := d.GetSecret(c.SecretName)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Error getting secret %v; error %v\", c.SecretName, err)\n\t\t}\n\n\t\tif actual != c.ExpectedValue {\n\t\t\tt.Errorf(\"Secret %v value is wrong; got %v; want %v\", c.SecretName, actual, c.ExpectedValue)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_SetSecret(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    KfDef\n\t\tSecret   Secret\n\t\tExpected KfDef\n\t}\n\n\tcases := []testCase{\n\t\t// No Secrets exist\n\t\t{\n\t\t\tInput: KfDef{},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Override a secret\n\t\t{\n\t\t\tInput: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"oldvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\ti := &KfDef{}\n\t\t*i = c.Input\n\t\ti.SetSecret(c.Secret)\n\n\t\tif !reflect.DeepEqual(*i, c.Expected) {\n\t\t\tpGot, _ := Pformat(i)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting secret %v; got;\\n%v\\nwant;\\n%v\", c.Secret.Name, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc Test_PluginNotFoundError(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    error\n\t\tExpected bool\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tInput:    NewPluginNotFound(\"someplugin\"),\n\t\t\tExpected: true,\n\t\t},\n\t\t{\n\t\t\tInput:    fmt.Errorf(\"some error\"),\n\t\t\tExpected: false,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tactual := IsPluginNotFound(c.Input)\n\t\tif actual != c.Expected {\n\t\t\tt.Errorf(\"IsPluginNotFound: Got %v; Want %v\", actual, c.Expected)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_SetApplicationParameter(t *testing.T) {\n\ttype testCase struct {\n\t\tInput     *KfDef\n\t\tAppName   string\n\t\tParamName string\n\t\tValue     string\n\t\tExpected  *KfDef\n\t}\n\n\tcases := []testCase{\n\t\t// New parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName:            \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tValue:     \"v1\",\n\t\t\tExpected: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []config.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Override parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []config.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tValue:     \"v1\",\n\t\t\tExpected: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []config.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Test cases below deal with backwards compatibility when we don't have an application.\n\t\t// New parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tComponentConfig: config.ComponentConfig{\n\t\t\t\t\t\tComponentParams: config.Parameters{\n\t\t\t\t\t\t\t\"app1\": []config.NameValue{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tValue:     \"v1\",\n\t\t\tExpected: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tComponentConfig: config.ComponentConfig{\n\t\t\t\t\t\tComponentParams: config.Parameters{\n\t\t\t\t\t\t\t\"app1\": []config.NameValue{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Override parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tComponentConfig: config.ComponentConfig{\n\t\t\t\t\t\tComponentParams: config.Parameters{\n\t\t\t\t\t\t\t\"app1\": []config.NameValue{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\tValue: \"oldvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tValue:     \"v1\",\n\t\t\tExpected: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tComponentConfig: config.ComponentConfig{\n\t\t\t\t\t\tComponentParams: config.Parameters{\n\t\t\t\t\t\t\t\"app1\": []config.NameValue{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tc.Input.SetApplicationParameter(c.AppName, c.ParamName, c.Value)\n\t\tif !reflect.DeepEqual(c.Input, c.Expected) {\n\t\t\tpGot, _ := Pformat(c.Input)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting App %v; Param %v; value %v; got;\\n%v\\nwant;\\n%v\", c.AppName, c.ParamName, c.Value, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_GetApplicationParameter(t *testing.T) {\n\ttype testCase struct {\n\t\tInput     *KfDef\n\t\tAppName   string\n\t\tParamName string\n\t\tExpected  string\n\t\tHasParam  bool\n\t}\n\n\tcases := []testCase{\n\t\t// No parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName:            \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tExpected:  \"\",\n\t\t\tHasParam:  false,\n\t\t},\n\t\t// Has Parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []config.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app2\",\n\t\t\tParamName: \"p1\",\n\t\t\tExpected:  \"old1\",\n\t\t\tHasParam:  true,\n\t\t},\n\t\t// Test cases below deal with backwards compatibility when we don't have an application.\n\t\t// No parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tComponentConfig: config.ComponentConfig{\n\t\t\t\t\t\tComponentParams: config.Parameters{\n\t\t\t\t\t\t\t\"app3\": []config.NameValue{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app3\",\n\t\t\tParamName: \"p1\",\n\t\t\tExpected:  \"\",\n\t\t\tHasParam:  false,\n\t\t},\n\t\t// Has parameter\n\t\t{\n\t\t\tInput: &KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tComponentConfig: config.ComponentConfig{\n\t\t\t\t\t\tComponentParams: config.Parameters{\n\t\t\t\t\t\t\t\"app4\": []config.NameValue{\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\tValue: \"oldvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app4\",\n\t\t\tParamName: \"p1\",\n\t\t\tExpected:  \"oldvalue\",\n\t\t\tHasParam:  true,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tv, hasParam := c.Input.GetApplicationParameter(c.AppName, c.ParamName)\n\n\t\tif c.HasParam != hasParam {\n\t\t\tt.Errorf(\"Error getting App %v; Param %v; hasParam; got; %v; want %v\", c.AppName, c.ParamName, hasParam, c.HasParam)\n\t\t}\n\n\t\tif c.Expected != v {\n\t\t\tt.Errorf(\"Error getting App %v; Param %v; got; %v; want %v\", c.AppName, c.ParamName, c, c.Expected)\n\t\t}\n\t}\n}\n\n// Pformat returns a pretty format output of any value.\nfunc Pformat(value interface{}) (string, error) {\n\tif s, ok := value.(string); ok {\n\t\treturn s, nil\n\t}\n\tvalueJson, err := json.MarshalIndent(value, \"\", \"  \")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(valueJson), nil\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1alpha1 contains API Schema definitions for the kfdef v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\n\npackage v1alpha1\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the kfdef v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\npackage v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"kfdef.apps.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfDef{},\n\t\t&KfDefList{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/testdata/doc.go",
    "content": "package testdata\n\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/testdata/kfctl_plugin_test.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1alpha1\nkind: KfDef\nspec:\n  plugins:\n    - name: fakeplugin\n      spec:\n        param: someparam\n        boolParam: true\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/v1alpha1_suite_test.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1alpha1\n\n// TODO(https://github.com/kubeflow/kubeflow/issues/3056): Fix the test and uncomment.\n//import (\n//\t\"log\"\n//\t\"os\"\n//\t\"path/filepath\"\n//\t\"testing\"\n//\n//\t\"k8s.io/client-go/kubernetes/scheme\"\n//\t\"k8s.io/client-go/rest\"\n//\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n//\t\"sigs.k8s.io/controller-runtime/pkg/envtest\"\n//)\n//\n//var cfg *rest.Config\n//var c client.Client\n//\n//func TestMain(m *testing.M) {\n//\tt := &envtest.Environment{\n//\t\tCRDDirectoryPaths: []string{filepath.Join(\"..\", \"..\", \"..\", \"..\", \"config\", \"crds\")},\n//\t}\n//\n//\terr := SchemeBuilder.AddToScheme(scheme.Scheme)\n//\tif err != nil {\n//\t\tlog.Fatal(err)\n//\t}\n//\n//\tif cfg, err = t.Start(); err != nil {\n//\t\tlog.Fatal(err)\n//\t}\n//\n//\tif c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil {\n//\t\tlog.Fatal(err)\n//\t}\n//\n//\tcode := m.Run()\n//\tt.Stop()\n//\tos.Exit(code)\n//}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1alpha1/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage v1alpha1\n\nimport (\n\tconfig \"github.com/kubeflow/kfctl/v3/config\"\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *AppConfig) DeepCopyInto(out *AppConfig) {\n\t*out = *in\n\tif in.Registries != nil {\n\t\tin, out := &in.Registries, &out.Registries\n\t\t*out = make([]*RegistryConfig, len(*in))\n\t\tfor i := range *in {\n\t\t\tif (*in)[i] != nil {\n\t\t\t\tin, out := &(*in)[i], &(*out)[i]\n\t\t\t\t*out = new(RegistryConfig)\n\t\t\t\t**out = **in\n\t\t\t}\n\t\t}\n\t}\n\tif in.Packages != nil {\n\t\tin, out := &in.Packages, &out.Packages\n\t\t*out = make([]KsPackage, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Components != nil {\n\t\tin, out := &in.Components, &out.Components\n\t\t*out = make([]KsComponent, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Parameters != nil {\n\t\tin, out := &in.Parameters, &out.Parameters\n\t\t*out = make([]KsParameter, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.ApplyParameters != nil {\n\t\tin, out := &in.ApplyParameters, &out.ApplyParameters\n\t\t*out = make([]KsParameter, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AppConfig.\nfunc (in *AppConfig) DeepCopy() *AppConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(AppConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *AppNotFound) DeepCopyInto(out *AppNotFound) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AppNotFound.\nfunc (in *AppNotFound) DeepCopy() *AppNotFound {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(AppNotFound)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Application) DeepCopyInto(out *Application) {\n\t*out = *in\n\tif in.KustomizeConfig != nil {\n\t\tin, out := &in.KustomizeConfig, &out.KustomizeConfig\n\t\t*out = new(KustomizeConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Application.\nfunc (in *Application) DeepCopy() *Application {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Application)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *EnvSource) DeepCopyInto(out *EnvSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvSource.\nfunc (in *EnvSource) DeepCopy() *EnvSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(EnvSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *HashedSource) DeepCopyInto(out *HashedSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HashedSource.\nfunc (in *HashedSource) DeepCopy() *HashedSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(HashedSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDef) DeepCopyInto(out *KfDef) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDef.\nfunc (in *KfDef) DeepCopy() *KfDef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfDef) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefCondition) DeepCopyInto(out *KfDefCondition) {\n\t*out = *in\n\tin.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)\n\tin.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefCondition.\nfunc (in *KfDefCondition) DeepCopy() *KfDefCondition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefCondition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefList) DeepCopyInto(out *KfDefList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]KfDef, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefList.\nfunc (in *KfDefList) DeepCopy() *KfDefList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfDefList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefSpec) DeepCopyInto(out *KfDefSpec) {\n\t*out = *in\n\tin.ComponentConfig.DeepCopyInto(&out.ComponentConfig)\n\tif in.Repos != nil {\n\t\tin, out := &in.Repos, &out.Repos\n\t\t*out = make([]Repo, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Secrets != nil {\n\t\tin, out := &in.Secrets, &out.Secrets\n\t\t*out = make([]Secret, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Plugins != nil {\n\t\tin, out := &in.Plugins, &out.Plugins\n\t\t*out = make([]Plugin, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Applications != nil {\n\t\tin, out := &in.Applications, &out.Applications\n\t\t*out = make([]Application, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefSpec.\nfunc (in *KfDefSpec) DeepCopy() *KfDefSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefStatus) DeepCopyInto(out *KfDefStatus) {\n\t*out = *in\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]KfDefCondition, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.ReposCache != nil {\n\t\tin, out := &in.ReposCache, &out.ReposCache\n\t\t*out = make(map[string]RepoCache, len(*in))\n\t\tfor key, val := range *in {\n\t\t\t(*out)[key] = val\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefStatus.\nfunc (in *KfDefStatus) DeepCopy() *KfDefStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KsComponent) DeepCopyInto(out *KsComponent) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KsComponent.\nfunc (in *KsComponent) DeepCopy() *KsComponent {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KsComponent)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KsLibrary) DeepCopyInto(out *KsLibrary) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KsLibrary.\nfunc (in *KsLibrary) DeepCopy() *KsLibrary {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KsLibrary)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KsModule) DeepCopyInto(out *KsModule) {\n\t*out = *in\n\tif in.Components != nil {\n\t\tin, out := &in.Components, &out.Components\n\t\t*out = make([]*KsComponent, len(*in))\n\t\tfor i := range *in {\n\t\t\tif (*in)[i] != nil {\n\t\t\t\tin, out := &(*in)[i], &(*out)[i]\n\t\t\t\t*out = new(KsComponent)\n\t\t\t\t**out = **in\n\t\t\t}\n\t\t}\n\t}\n\tif in.Modules != nil {\n\t\tin, out := &in.Modules, &out.Modules\n\t\t*out = make([]*KsModule, len(*in))\n\t\tfor i := range *in {\n\t\t\tif (*in)[i] != nil {\n\t\t\t\tin, out := &(*in)[i], &(*out)[i]\n\t\t\t\t*out = new(KsModule)\n\t\t\t\t(*in).DeepCopyInto(*out)\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KsModule.\nfunc (in *KsModule) DeepCopy() *KsModule {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KsModule)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KsPackage) DeepCopyInto(out *KsPackage) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KsPackage.\nfunc (in *KsPackage) DeepCopy() *KsPackage {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KsPackage)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KsParameter) DeepCopyInto(out *KsParameter) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KsParameter.\nfunc (in *KsParameter) DeepCopy() *KsParameter {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KsParameter)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KsRegistry) DeepCopyInto(out *KsRegistry) {\n\t*out = *in\n\tif in.Libraries != nil {\n\t\tin, out := &in.Libraries, &out.Libraries\n\t\t*out = make(map[string]LibrarySpec, len(*in))\n\t\tfor key, val := range *in {\n\t\t\t(*out)[key] = val\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KsRegistry.\nfunc (in *KsRegistry) DeepCopy() *KsRegistry {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KsRegistry)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KustomizeConfig) DeepCopyInto(out *KustomizeConfig) {\n\t*out = *in\n\tif in.RepoRef != nil {\n\t\tin, out := &in.RepoRef, &out.RepoRef\n\t\t*out = new(RepoRef)\n\t\t**out = **in\n\t}\n\tif in.Overlays != nil {\n\t\tin, out := &in.Overlays, &out.Overlays\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Parameters != nil {\n\t\tin, out := &in.Parameters, &out.Parameters\n\t\t*out = make([]config.NameValue, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KustomizeConfig.\nfunc (in *KustomizeConfig) DeepCopy() *KustomizeConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KustomizeConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *LibrarySpec) DeepCopyInto(out *LibrarySpec) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LibrarySpec.\nfunc (in *LibrarySpec) DeepCopy() *LibrarySpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(LibrarySpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *LiteralSource) DeepCopyInto(out *LiteralSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LiteralSource.\nfunc (in *LiteralSource) DeepCopy() *LiteralSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(LiteralSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Plugin) DeepCopyInto(out *Plugin) {\n\t*out = *in\n\tif in.Spec != nil {\n\t\tin, out := &in.Spec, &out.Spec\n\t\t*out = new(runtime.RawExtension)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Plugin.\nfunc (in *Plugin) DeepCopy() *Plugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Plugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *PluginNotFound) DeepCopyInto(out *PluginNotFound) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginNotFound.\nfunc (in *PluginNotFound) DeepCopy() *PluginNotFound {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(PluginNotFound)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RegistriesConfigFile) DeepCopyInto(out *RegistriesConfigFile) {\n\t*out = *in\n\tif in.Registries != nil {\n\t\tin, out := &in.Registries, &out.Registries\n\t\t*out = make([]*RegistryConfig, len(*in))\n\t\tfor i := range *in {\n\t\t\tif (*in)[i] != nil {\n\t\t\t\tin, out := &(*in)[i], &(*out)[i]\n\t\t\t\t*out = new(RegistryConfig)\n\t\t\t\t**out = **in\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistriesConfigFile.\nfunc (in *RegistriesConfigFile) DeepCopy() *RegistriesConfigFile {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RegistriesConfigFile)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Registry) DeepCopyInto(out *Registry) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Registry.\nfunc (in *Registry) DeepCopy() *Registry {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Registry)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RegistryConfig) DeepCopyInto(out *RegistryConfig) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistryConfig.\nfunc (in *RegistryConfig) DeepCopy() *RegistryConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RegistryConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Repo) DeepCopyInto(out *Repo) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Repo.\nfunc (in *Repo) DeepCopy() *Repo {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Repo)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoCache) DeepCopyInto(out *RepoCache) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoCache.\nfunc (in *RepoCache) DeepCopy() *RepoCache {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoCache)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoRef) DeepCopyInto(out *RepoRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoRef.\nfunc (in *RepoRef) DeepCopy() *RepoRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Secret) DeepCopyInto(out *Secret) {\n\t*out = *in\n\tif in.SecretSource != nil {\n\t\tin, out := &in.SecretSource, &out.SecretSource\n\t\t*out = new(SecretSource)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Secret.\nfunc (in *Secret) DeepCopy() *Secret {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Secret)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretNotFound) DeepCopyInto(out *SecretNotFound) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNotFound.\nfunc (in *SecretNotFound) DeepCopy() *SecretNotFound {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretNotFound)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretRef) DeepCopyInto(out *SecretRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretRef.\nfunc (in *SecretRef) DeepCopy() *SecretRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretSource) DeepCopyInto(out *SecretSource) {\n\t*out = *in\n\tif in.LiteralSource != nil {\n\t\tin, out := &in.LiteralSource, &out.LiteralSource\n\t\t*out = new(LiteralSource)\n\t\t**out = **in\n\t}\n\tif in.HashedSource != nil {\n\t\tin, out := &in.HashedSource, &out.HashedSource\n\t\t*out = new(HashedSource)\n\t\t**out = **in\n\t}\n\tif in.EnvSource != nil {\n\t\tin, out := &in.EnvSource, &out.EnvSource\n\t\t*out = new(EnvSource)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretSource.\nfunc (in *SecretSource) DeepCopy() *SecretSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/README.md",
    "content": "## `KfDef` defines an interface for controlling Kubeflow resources\n\nIn the following sections we explain what fields in `KfDefSpec` means.\n\n### KfDefSpec.Applications\n\nThis is the list of applications that Kubeflow cluster will be installed.\n\n- Name: Name identifier of the application.\n- KustomizeConfig: Configurations for Kustomize to find the manifests and additional information to apply to.\n\n#### KustomizeConfig\n\n- RepoRef:\n  - Name: Name of the repo Kustomize will be looking into.  The repo must be on the list of `KfDefSpec.Repos`.\n  - Path: Relative path in the repo to find the manifests.\n- Overlays: A list of names to be applied as overlays.\n- Parameters: Name/value pair of parameters to override the parameters defined in manifests.  Example: [link](https://github.com/kubeflow/manifests/blob/master/profiles/base/params.env#L3-L4)\n\n### KfDefSpec.Plugins\n\nThis is the list of plugins that Kubeflow will be run on top of.  For example, platforms like GCP/AWS are part of plugins.\n\n- Definitions of plugins should go to [plugins folder](https://github.com/kubeflow/kfctl/tree/master/pkg/apis/apps/plugins).\n- Plugins must have associated [kfapp handler](https://github.com/kubeflow/kfctl/tree/master/pkg/kfapp) for them to be applied.\n\n### KfDefSpec.Secrets\n\nThis is a set of secrets Kubeflow needs during installation.\n\n- LiteralSource: User provides the secret information as literal string into `KfDef` yaml file.  This is not recommended and we are planning to deprecate it.\n- EnvSource: User provides the name of ENV var and we will use the value for create the secret.\n\n### KfDefSpec.Repos\n\nThis is a list of GIT repositories that we will cache and use as reference during installations.\n\n- Name: The name identifier of the repository cached.\n- URI: The URI to download the repository.\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/application_types.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1beta1\n\nimport (\n\t\"fmt\"\n\t\"github.com/ghodss/yaml\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tlog \"github.com/sirupsen/logrus\"\n\tv1 \"k8s.io/api/core/v1\"\n\tvalid \"k8s.io/apimachinery/pkg/api/validation\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"os\"\n\t\"strings\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfDef is the Schema for the applications API\n// +k8s:openapi-gen=true\ntype KfDef struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   KfDefSpec   `json:\"spec,omitempty\"`\n\tStatus KfDefStatus `json:\"status,omitempty\"`\n}\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfDefList contains a list of KfDef\ntype KfDefList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []KfDef `json:\"items\"`\n}\n\ntype KfDefSpec struct {\n\tVersion      string        `json:\"version,omitempty\"`\n\tApplications []Application `json:\"applications,omitempty\"`\n\tPlugins      []Plugin      `json:\"plugins,omitempty\"`\n\tSecrets      []Secret      `json:\"secrets,omitempty\"`\n\tRepos        []Repo        `json:\"repos,omitempty\"`\n}\n\n// Application defines an application to install\ntype Application struct {\n\tName            string           `json:\"name,omitempty\"`\n\tKustomizeConfig *KustomizeConfig `json:\"kustomizeConfig,omitempty\"`\n}\n\ntype KustomizeConfig struct {\n\tRepoRef    *RepoRef    `json:\"repoRef,omitempty\"`\n\tOverlays   []string    `json:\"overlays,omitempty\"`\n\tParameters []NameValue `json:\"parameters,omitempty\"`\n}\n\ntype RepoRef struct {\n\tName string `json:\"name,omitempty\"`\n\tPath string `json:\"path,omitempty\"`\n}\n\ntype NameValue struct {\n\tName  string `json:\"name,omitempty\"`\n\tValue string `json:\"value,omitempty\"`\n}\n\n// Plugin can be used to customize the generation and deployment of Kubeflow\ntype Plugin struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec *runtime.RawExtension `json:\"spec,omitempty\"`\n}\n\n// Secret provides information about secrets needed to configure Kubeflow.\n// Secrets can be provided via references.\ntype Secret struct {\n\tName         string        `json:\"name,omitempty\"`\n\tSecretSource *SecretSource `json:\"secretSource,omitempty\"`\n}\n\ntype SecretSource struct {\n\tLiteralSource *LiteralSource `json:\"literalSource,omitempty\"`\n\tEnvSource     *EnvSource     `json:\"envSource,omitempty\"`\n}\n\ntype LiteralSource struct {\n\tValue string `json:\"value,omitempty\"`\n}\n\ntype EnvSource struct {\n\tName string `json:\"name,omitempty\"`\n}\n\n// SecretRef is a reference to a secret\ntype SecretRef struct {\n\t// Name of the secret\n\tName string `json:\"name,omitempty\"`\n}\n\n// Repo provides information about a repository providing config (e.g. kustomize packages,\n// Deployment manager configs, etc...)\ntype Repo struct {\n\t// Name is a name to identify the repository.\n\tName string `json:\"name,omitempty\"`\n\t// URI where repository can be obtained.\n\t// Can use any URI understood by go-getter:\n\t// https://github.com/hashicorp/go-getter/blob/master/README.md#installation-and-usage\n\tURI string `json:\"uri,omitempty\"`\n}\n\n// KfDefStatus defines the observed state of KfDef\ntype KfDefStatus struct {\n\tConditions []KfDefCondition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"`\n\t// ReposCache is used to cache information about local caching of the URIs.\n\tReposCache []RepoCache `json:\"reposCache,omitempty\"`\n}\n\ntype RepoCache struct {\n\tName      string `json:\"name,omitempty\"`\n\tLocalPath string `json:\"localPath,string\"`\n}\n\ntype KfDefConditionType string\n\nconst (\n\t// KfAvailable means Kubeflow is serving.\n\tKfAvailable KfDefConditionType = \"Available\"\n\n\t// KfDegraded means one or more Kubeflow services are not healthy.\n\tKfDegraded KfDefConditionType = \"Degraded\"\n\n\t// Pending means Kubeflow services is being updated.\n\tPending KfDefConditionType = \"Pending\"\n)\n\ntype KfDefCondition struct {\n\t// Type of deployment condition.\n\tType KfDefConditionType `json:\"type\"`\n\t// Status of the condition, one of True, False, Unknown.\n\tStatus v1.ConditionStatus `json:\"status\"`\n\t// The last time this condition was updated.\n\tLastUpdateTime metav1.Time `json:\"lastUpdateTime,omitempty\"`\n\t// Last time the condition transitioned from one status to another.\n\tLastTransitionTime metav1.Time `json:\"lastTransitionTime,omitempty\"`\n\t// The reason for the condition's last transition.\n\tReason string `json:\"reason,omitempty\"`\n\t// A human readable message indicating details about the transition.\n\tMessage string `json:\"message,omitempty\"`\n}\n\n// GetPluginSpec will try to unmarshal the spec for the specified plugin to the supplied\n// interface. Returns an error if the plugin isn't defined or if there is a problem\n// unmarshaling it.\nfunc (d *KfDef) GetPluginSpec(pluginKind string, s interface{}) error {\n\tfor _, p := range d.Spec.Plugins {\n\t\tif p.Kind != pluginKind {\n\t\t\tcontinue\n\t\t}\n\t\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t\t// and then unserialize it.\n\t\tspecBytes, err := yaml.Marshal(p.Spec)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not marshal plugin %v args; error %v\", pluginKind, err)\n\t\t\treturn err\n\t\t}\n\n\t\terr = yaml.Unmarshal(specBytes, s)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not unmarshal plugin %v to the provided type; error %v\", pluginKind, err)\n\t\t}\n\t\treturn nil\n\t}\n\treturn &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"Plugin not found: %v\", pluginKind),\n\t}\n}\n\n// SetPluginSpec sets the requested parameter: add the plugin if it doesn't already exist, or replace existing plugin.\nfunc (d *KfDef) SetPluginSpec(pluginKind string, spec interface{}) error {\n\t// Convert spec to RawExtension\n\n\tr := &runtime.RawExtension{}\n\n\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t// and then unserialize it.\n\tspecBytes, err := yaml.Marshal(spec)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not marshal spec; error %v\", err)\n\t\treturn err\n\t}\n\n\terr = yaml.Unmarshal(specBytes, r)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not unmarshal plugin to RawExtension; error %v\", err)\n\t}\n\n\tindex := -1\n\n\tfor i, p := range d.Spec.Plugins {\n\t\tif p.Kind == pluginKind {\n\t\t\tindex = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif index == -1 {\n\t\t// Plugin in doesn't exist so add it\n\t\tlog.Infof(\"Adding plugin %v\", pluginKind)\n\n\t\tp := Plugin{}\n\t\tp.Name = string(pluginKind)\n\t\tp.Kind = pluginKind\n\t\td.Spec.Plugins = append(d.Spec.Plugins, p)\n\n\t\tindex = len(d.Spec.Plugins) - 1\n\t}\n\n\td.Spec.Plugins[index].Spec = r\n\treturn nil\n}\n\n// GetSecret returns the specified secret or an error if the secret isn't specified.\nfunc (d *KfDef) GetSecret(name string) (string, error) {\n\tfor _, s := range d.Spec.Secrets {\n\t\tif s.Name != name {\n\t\t\tcontinue\n\t\t}\n\t\tif s.SecretSource.LiteralSource != nil {\n\t\t\treturn s.SecretSource.LiteralSource.Value, nil\n\t\t}\n\t\tif s.SecretSource.EnvSource != nil {\n\t\t\treturn os.Getenv(s.SecretSource.EnvSource.Name), nil\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"No secret source provided for secret %v\", name)\n\t}\n\treturn \"\", &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"Secret not found: %v\", name),\n\t}\n}\n\n// SetSecret sets the specified secret; if a secret with the given name already exists it is overwritten.\nfunc (d *KfDef) SetSecret(newSecret Secret) {\n\tfor i, s := range d.Spec.Secrets {\n\t\tif s.Name == newSecret.Name {\n\t\t\td.Spec.Secrets[i] = newSecret\n\t\t\treturn\n\t\t}\n\t}\n\td.Spec.Secrets = append(d.Spec.Secrets, newSecret)\n}\n\nfunc (d *KfDef) DeleteApplication(appName string) {\n\t// First we check applications for an application with the specified name.\n\tif d.Spec.Applications != nil {\n\t\tapplications := []Application{}\n\t\tfor _, a := range d.Spec.Applications {\n\t\t\tif a.Name != appName {\n\t\t\t\tapplications = append(applications, a)\n\t\t\t}\n\t\t}\n\t\td.Spec.Applications = applications\n\t}\n}\n\n// IsValid returns true if the spec is a valid and complete spec.\n// If false it will also return a string providing a message about why its invalid.\nfunc (d *KfDef) IsValid() (bool, string) {\n\t// Validate KfConfig\n\terrs := valid.NameIsDNSLabel(d.Name, false)\n\tif errs != nil && len(errs) > 0 {\n\t\treturn false, fmt.Sprintf(\"invalid name due to %v\", strings.Join(errs, \",\"))\n\t}\n\n\treturn true, \"\"\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/application_types_test.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1beta1\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/prometheus/common/log\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"reflect\"\n\t\"testing\"\n)\n\ntype FakePluginSpec struct {\n\tParam     string `json:\"param,omitempty\"`\n\tBoolParam bool   `json:\"boolParam,omitempty\"`\n}\n\nfunc TestKfDef_GetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tFilename   string\n\t\tPluginKind string\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tFilename:   \"kfctl_plugin_test.yaml\",\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"someparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Filename)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\n\t\tlog.Infof(\"Want \")\n\t\td := &KfDef{}\n\t\terr := yaml.Unmarshal(buf, d)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not parse as KfDef error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginKind, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin spec got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_SetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tPluginKind string\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"oldparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Override the existing plugin\n\t\t{\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Add a new plugin\n\t\t{\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\td := &KfDef{}\n\n\tfor _, c := range cases {\n\t\terr := d.SetPluginSpec(c.PluginKind, c.Expected)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not set plugin spec; error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginKind, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin spec got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_GetSecret(t *testing.T) {\n\td := &KfDef{\n\t\tSpec: KfDefSpec{\n\t\t\tSecrets: []Secret{\n\t\t\t\t{\n\t\t\t\t\tName: \"s1\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\tValue: \"somedata\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"s2\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tEnvSource: &EnvSource{\n\t\t\t\t\t\t\tName: \"s2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\ttype testCase struct {\n\t\tSecretName    string\n\t\tExpectedValue string\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tSecretName:    \"s1\",\n\t\t\tExpectedValue: \"somedata\",\n\t\t},\n\t\t{\n\t\t\tSecretName:    \"s2\",\n\t\t\tExpectedValue: \"somesecret\",\n\t\t},\n\t}\n\n\tos.Setenv(\"s2\", \"somesecret\")\n\tfor _, c := range cases {\n\t\tactual, err := d.GetSecret(c.SecretName)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Error getting secret %v; error %v\", c.SecretName, err)\n\t\t}\n\n\t\tif actual != c.ExpectedValue {\n\t\t\tt.Errorf(\"Secret %v value is wrong; got %v; want %v\", c.SecretName, actual, c.ExpectedValue)\n\t\t}\n\t}\n}\n\nfunc TestKfDef_SetSecret(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    KfDef\n\t\tSecret   Secret\n\t\tExpected KfDef\n\t}\n\n\tcases := []testCase{\n\t\t// No Secrets exist\n\t\t{\n\t\t\tInput: KfDef{},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Override a secret\n\t\t{\n\t\t\tInput: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"oldvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfDef{\n\t\t\t\tSpec: KfDefSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\ti := &KfDef{}\n\t\t*i = c.Input\n\t\ti.SetSecret(c.Secret)\n\n\t\tif !reflect.DeepEqual(*i, c.Expected) {\n\t\t\tpGot, _ := Pformat(i)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting secret %v; got;\\n%v\\nwant;\\n%v\", c.Secret.Name, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc Test_DeleteApplication(t *testing.T) {\n\ttype testCase struct {\n\t\tFilename      string\n\t\tDeleteAppName string\n\t\tExpected      []Application\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tFilename:      \"kfctl_plugin_test.yaml\",\n\t\t\tDeleteAppName: \"delete\",\n\t\t\tExpected: []Application{\n\t\t\t\t{\n\t\t\t\t\tName: \"keep\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Filename)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\n\t\tlog.Infof(\"Want \")\n\t\td := &KfDef{}\n\t\terr := yaml.Unmarshal(buf, d)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not parse as KfDef error %v\", err)\n\t\t}\n\n\t\td.DeleteApplication(c.DeleteAppName)\n\t\tif !reflect.DeepEqual(d.Spec.Applications, c.Expected) {\n\t\t\tpGot, _ := Pformat(d.Spec.Applications)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error deleting applicaitons got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\n// Pformat returns a pretty format output of any value.\nfunc Pformat(value interface{}) (string, error) {\n\tif s, ok := value.(string); ok {\n\t\treturn s, nil\n\t}\n\tvalueJson, err := json.MarshalIndent(value, \"\", \"  \")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(valueJson), nil\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1beta1 contains API Schema definitions for the kfdef v1beta1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\n\npackage v1beta1\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the kfdef v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\npackage v1beta1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"kfdef.apps.kubeflow.org\", Version: \"v1beta1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfDef{},\n\t\t&KfDefList{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/testdata/doc.go",
    "content": "package testdata\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/testdata/kfctl_plugin_test.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1beta1\nkind: KfDef\nspec:\n  applications:\n  - name: delete\n  - name: keep\n  plugins:\n  - kind: fakeplugin\n    spec:\n      param: someparam\n      boolParam: true\n"
  },
  {
    "path": "pkg/apis/apps/kfdef/v1beta1/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage v1beta1\n\nimport (\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Application) DeepCopyInto(out *Application) {\n\t*out = *in\n\tif in.KustomizeConfig != nil {\n\t\tin, out := &in.KustomizeConfig, &out.KustomizeConfig\n\t\t*out = new(KustomizeConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Application.\nfunc (in *Application) DeepCopy() *Application {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Application)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *EnvSource) DeepCopyInto(out *EnvSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvSource.\nfunc (in *EnvSource) DeepCopy() *EnvSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(EnvSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDef) DeepCopyInto(out *KfDef) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDef.\nfunc (in *KfDef) DeepCopy() *KfDef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfDef) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefCondition) DeepCopyInto(out *KfDefCondition) {\n\t*out = *in\n\tin.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)\n\tin.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefCondition.\nfunc (in *KfDefCondition) DeepCopy() *KfDefCondition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefCondition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefList) DeepCopyInto(out *KfDefList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ListMeta.DeepCopyInto(&out.ListMeta)\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]KfDef, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefList.\nfunc (in *KfDefList) DeepCopy() *KfDefList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfDefList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefSpec) DeepCopyInto(out *KfDefSpec) {\n\t*out = *in\n\tif in.Applications != nil {\n\t\tin, out := &in.Applications, &out.Applications\n\t\t*out = make([]Application, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Plugins != nil {\n\t\tin, out := &in.Plugins, &out.Plugins\n\t\t*out = make([]Plugin, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Secrets != nil {\n\t\tin, out := &in.Secrets, &out.Secrets\n\t\t*out = make([]Secret, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Repos != nil {\n\t\tin, out := &in.Repos, &out.Repos\n\t\t*out = make([]Repo, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefSpec.\nfunc (in *KfDefSpec) DeepCopy() *KfDefSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefStatus) DeepCopyInto(out *KfDefStatus) {\n\t*out = *in\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]KfDefCondition, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.ReposCache != nil {\n\t\tin, out := &in.ReposCache, &out.ReposCache\n\t\t*out = make([]RepoCache, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefStatus.\nfunc (in *KfDefStatus) DeepCopy() *KfDefStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KustomizeConfig) DeepCopyInto(out *KustomizeConfig) {\n\t*out = *in\n\tif in.RepoRef != nil {\n\t\tin, out := &in.RepoRef, &out.RepoRef\n\t\t*out = new(RepoRef)\n\t\t**out = **in\n\t}\n\tif in.Overlays != nil {\n\t\tin, out := &in.Overlays, &out.Overlays\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Parameters != nil {\n\t\tin, out := &in.Parameters, &out.Parameters\n\t\t*out = make([]NameValue, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KustomizeConfig.\nfunc (in *KustomizeConfig) DeepCopy() *KustomizeConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KustomizeConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *LiteralSource) DeepCopyInto(out *LiteralSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LiteralSource.\nfunc (in *LiteralSource) DeepCopy() *LiteralSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(LiteralSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *NameValue) DeepCopyInto(out *NameValue) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NameValue.\nfunc (in *NameValue) DeepCopy() *NameValue {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(NameValue)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Plugin) DeepCopyInto(out *Plugin) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tif in.Spec != nil {\n\t\tin, out := &in.Spec, &out.Spec\n\t\t*out = new(runtime.RawExtension)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Plugin.\nfunc (in *Plugin) DeepCopy() *Plugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Plugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Repo) DeepCopyInto(out *Repo) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Repo.\nfunc (in *Repo) DeepCopy() *Repo {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Repo)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoCache) DeepCopyInto(out *RepoCache) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoCache.\nfunc (in *RepoCache) DeepCopy() *RepoCache {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoCache)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoRef) DeepCopyInto(out *RepoRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoRef.\nfunc (in *RepoRef) DeepCopy() *RepoRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Secret) DeepCopyInto(out *Secret) {\n\t*out = *in\n\tif in.SecretSource != nil {\n\t\tin, out := &in.SecretSource, &out.SecretSource\n\t\t*out = new(SecretSource)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Secret.\nfunc (in *Secret) DeepCopy() *Secret {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Secret)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretRef) DeepCopyInto(out *SecretRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretRef.\nfunc (in *SecretRef) DeepCopy() *SecretRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretSource) DeepCopyInto(out *SecretSource) {\n\t*out = *in\n\tif in.LiteralSource != nil {\n\t\tin, out := &in.LiteralSource, &out.LiteralSource\n\t\t*out = new(LiteralSource)\n\t\t**out = **in\n\t}\n\tif in.EnvSource != nil {\n\t\tin, out := &in.EnvSource, &out.EnvSource\n\t\t*out = new(EnvSource)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretSource.\nfunc (in *SecretSource) DeepCopy() *SecretSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfupgrade/kfupgrade.go",
    "content": "// Copyright 2019 The Kubeflow Authors\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// Package kfupgrade contains kfupgrade related types\npackage kfupgrade\n"
  },
  {
    "path": "pkg/apis/apps/kfupgrade/v1alpha1/application_types.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage v1alpha1\n\nimport (\n\t\"fmt\"\n\t\"github.com/ghodss/yaml\"\n\tgogetter \"github.com/hashicorp/go-getter\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"io/ioutil\"\n\t\"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"path\"\n)\n\nconst (\n\tKfUpgradeFile = \"update.yaml\"\n)\n\ntype KfUpgradeSpec struct {\n\t// Reference to the current (existing) KfDef.\n\tCurrentKfDef *KfDefRef `json:\"currentKfDef,omitempty\"`\n\n\t// Reference to the new KfDef.\n\t// +optional\n\tNewKfDef *KfDefRef `json:\"newKfDef,omitempty\"`\n\n\t// Base config file used to generate the new KfDef.\n\t// +optional\n\tBaseConfigPath string `json:\"baseConfigPath,omitempty\"`\n}\n\ntype KfDefRef struct {\n\t// Name of the referrent.\n\tName string `json:\"name,omitempty\"`\n\n\t// Version of the referent.\n\t// +optional\n\tVersion string `json:\"version,omitempty\"`\n}\n\n// KfUpgradeStatus defines the observed state of KfUpgrade\ntype KfUpgradeStatus struct {\n\tConditions []KfUpgradeCondition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,6,rep,name=conditions\"`\n}\n\ntype KfUpgradeConditionType string\n\nconst (\n\t// KfDeploying means Kubeflow is in the process of being deployed.\n\tKfUpgradeInProgress KfUpgradeConditionType = \"InProgress\"\n\n\t// KfSucceeded means Kubeflow was successfully deployed.\n\tKfUpgradeSucceeded KfUpgradeConditionType = \"Succeeded\"\n\n\t// KfFailed meansthere was a problem deploying Kubeflow.\n\tKfUpgradeFailed KfUpgradeConditionType = \"Failed\"\n\n\t// Reasons for conditions\n\n\t// InvalidKfUpgradeSpecReason indicates the KfUpgrade was not valid.\n\tInvalidKfUpgradeSpecReason = \"InvalidKfUpgradeSpec\"\n)\n\ntype KfUpgradeCondition struct {\n\t// Type of deployment condition.\n\tType KfUpgradeConditionType `json:\"type\" protobuf:\"bytes,1,opt,name=type,casttype=KfDefConditionType\"`\n\t// Status of the condition, one of True, False, Unknown.\n\tStatus v1.ConditionStatus `json:\"status\" protobuf:\"bytes,2,opt,name=status,casttype=k8s.io/api/core/v1.ConditionStatus\"`\n\t// The last time this condition was updated.\n\tLastUpdateTime metav1.Time `json:\"lastUpdateTime,omitempty\" protobuf:\"bytes,6,opt,name=lastUpdateTime\"`\n\t// Last time the condition transitioned from one status to another.\n\tLastTransitionTime metav1.Time `json:\"lastTransitionTime,omitempty\" protobuf:\"bytes,7,opt,name=lastTransitionTime\"`\n\t// The reason for the condition's last transition.\n\tReason string `json:\"reason,omitempty\" protobuf:\"bytes,4,opt,name=reason\"`\n\t// A human readable message indicating details about the transition.\n\tMessage string `json:\"message,omitempty\" protobuf:\"bytes,5,opt,name=message\"`\n}\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfUpgrade is the Schema for the applications API\n// +k8s:openapi-gen=true\ntype KfUpgrade struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   KfUpgradeSpec   `json:\"spec,omitempty\"`\n\tStatus KfUpgradeStatus `json:\"status,omitempty\"`\n}\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// KfUpgradeList contains a list of KfUpgrade\ntype KfUpgradeList struct {\n\tmetav1.TypeMeta `json:\",inline\"`\n\tmetav1.ListMeta `json:\"metadata,omitempty\"`\n\tItems           []KfUpgrade `json:\"items\"`\n}\n\n// LoadKfUpgradeFromUri constructs a KfUpgrade given the path to a YAML file.\n// configFile is the path to the YAML file containing the KfDef spec. Can be any URI supported by hashicorp\n// go-getter.\nfunc LoadKfUpgradeFromUri(configFile string) (*KfUpgrade, error) {\n\tif configFile == \"\" {\n\t\treturn nil, fmt.Errorf(\"config file must be the URI of a KfDef spec\")\n\t}\n\n\tappDir, err := ioutil.TempDir(\"\", \"\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Create a temporary directory to copy the file to.\")\n\t}\n\t// Open config file\n\tappFile := path.Join(appDir, KfUpgradeFile)\n\n\tlog.Infof(\"Downloading %v to %v\", configFile, appFile)\n\terr = gogetter.GetFile(appFile, configFile)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not fetch specified config %s: %v\", configFile, err),\n\t\t}\n\t}\n\n\t// Read contents\n\tconfigFileBytes, err := ioutil.ReadFile(appFile)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not read from config file %s: %v\", configFile, err),\n\t\t}\n\t}\n\t// Unmarshal content onto KfUpgrade struct\n\tkfUpgrade := &KfUpgrade{}\n\tif err := yaml.Unmarshal(configFileBytes, kfUpgrade); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not unmarshal config file onto KfUpgrade struct: %v\", err),\n\t\t}\n\t}\n\n\treturn kfUpgrade, nil\n}\n\n// WriteToFile write the KfUpgrade to a file.\nfunc (u *KfUpgrade) WriteToFile(path string) error {\n\t// Write app.yaml\n\tbuf, bufErr := yaml.Marshal(u)\n\tif bufErr != nil {\n\t\tlog.Errorf(\"Error marshaling kfdev; %v\", bufErr)\n\t\treturn bufErr\n\t}\n\tlog.Infof(\"Writing KfUpgrade to %v\", path)\n\treturn ioutil.WriteFile(path, buf, 0644)\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfupgrade/v1alpha1/doc.go",
    "content": "// Copyright 2019 The Kubeflow Authors\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// Package v1alpha1 contains API Schema definitions for the kfupgrade v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfupgrade\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfupgrade.apps.kubeflow.org\n\npackage v1alpha1\n"
  },
  {
    "path": "pkg/apis/apps/kfupgrade/v1alpha1/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the kfdef v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfupdate\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfupdate.apps.kubeflow.org\npackage v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"kfupdate.apps.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfUpgrade{},\n\t\t&KfUpgradeList{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/apis/apps/kfupgrade/v1alpha1/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage v1alpha1\n\nimport (\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfDefRef) DeepCopyInto(out *KfDefRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfDefRef.\nfunc (in *KfDefRef) DeepCopy() *KfDefRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfDefRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfUpgrade) DeepCopyInto(out *KfUpgrade) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfUpgrade.\nfunc (in *KfUpgrade) DeepCopy() *KfUpgrade {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfUpgrade)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfUpgrade) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfUpgradeCondition) DeepCopyInto(out *KfUpgradeCondition) {\n\t*out = *in\n\tin.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)\n\tin.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfUpgradeCondition.\nfunc (in *KfUpgradeCondition) DeepCopy() *KfUpgradeCondition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfUpgradeCondition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfUpgradeList) DeepCopyInto(out *KfUpgradeList) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tout.ListMeta = in.ListMeta\n\tif in.Items != nil {\n\t\tin, out := &in.Items, &out.Items\n\t\t*out = make([]KfUpgrade, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfUpgradeList.\nfunc (in *KfUpgradeList) DeepCopy() *KfUpgradeList {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfUpgradeList)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfUpgradeList) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfUpgradeSpec) DeepCopyInto(out *KfUpgradeSpec) {\n\t*out = *in\n\tif in.CurrentKfDef != nil {\n\t\tin, out := &in.CurrentKfDef, &out.CurrentKfDef\n\t\t*out = new(KfDefRef)\n\t\t**out = **in\n\t}\n\tif in.NewKfDef != nil {\n\t\tin, out := &in.NewKfDef, &out.NewKfDef\n\t\t*out = new(KfDefRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfUpgradeSpec.\nfunc (in *KfUpgradeSpec) DeepCopy() *KfUpgradeSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfUpgradeSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfUpgradeStatus) DeepCopyInto(out *KfUpgradeStatus) {\n\t*out = *in\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]KfUpgradeCondition, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfUpgradeStatus.\nfunc (in *KfUpgradeStatus) DeepCopy() *KfUpgradeStatus {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfUpgradeStatus)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/aws/aws.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage aws\n"
  },
  {
    "path": "pkg/apis/apps/plugins/aws/v1alpha1/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1beta1 contains API Schema definitions for the kfdef v1beta1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\n\npackage v1alpha1\n"
  },
  {
    "path": "pkg/apis/apps/plugins/aws/v1alpha1/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the KfAwsPlugin v1alpha1.\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/aws\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=aws.plugins.kubeflow.org\npackage v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"aws.plugins.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfAwsPlugin{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/aws/v1alpha1/types.go",
    "content": "package v1alpha1\n\nimport (\n\tkfdeftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1beta1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// +k8s:openapi-gen=true\n// Placeholder for the plugin API.\ntype KfAwsPlugin struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec AwsPluginSpec `json:\"spec,omitempty\"`\n}\n\n// AwsPlugin defines the extra data provided by the GCP Plugin in KfDef\ntype AwsPluginSpec struct {\n\tAuth *Auth `json:\"auth,omitempty\"`\n\n\tRegion string `json:\"region,omitempty\"`\n\n\tRoles []string `json:\"roles,omitempty\"`\n}\n\ntype Auth struct {\n\tBasicAuth *BasicAuth `json:\"basicAuth,omitempty\"`\n\tOidc      *OIDC      `json:\"oidc,omitempty\"`\n\tCognito   *Coginito  `json:\"cognito,omitempty\"`\n}\n\ntype BasicAuth struct {\n\tUsername string                `json:\"username,omitempty\"`\n\tPassword *kfdeftypes.SecretRef `json:\"password,omitempty\"`\n}\n\ntype OIDC struct {\n\tOidcAuthorizationEndpoint string `json:\"oidcAuthorizationEndpoint,omitempty\"`\n\tOidcIssuer                string `json:\"oidcIssuer,omitempty\"`\n\tOidcTokenEndpoint         string `json:\"oidcTokenEndpoint,omitempty\"`\n\tOidcUserInfoEndpoint      string `json:\"oidcUserInfoEndpoint,omitempty\"`\n\tCertArn                   string `json:\"certArn,omitempty\"`\n\tOAuthClientId             string `json:\"oAuthClientId,omitempty\"`\n\tOAuthClientSecret         string `json:\"oAuthClientSecret,omitempty\"`\n}\n\ntype Coginito struct {\n\tCognitoAppClientId    string `json:\"cognitoAppClientId,omitempty\"`\n\tCognitoUserPoolArn    string `json:\"cognitoUserPoolArn,omitempty\"`\n\tCognitoUserPoolDomain string `json:\"cognitoUserPoolDomain,omitempty\"`\n\tCertArn               string `json:\"certArn,omitempty\"`\n}\n\n// IsValid returns true if the spec is a valid and complete spec.\n// If false it will also return a string providing a message about why its invalid.\nfunc (plugin *AwsPluginSpec) IsValid() (bool, string) {\n\tbasicAuthSet := plugin.Auth.BasicAuth != nil\n\toidcAuthSet := plugin.Auth.Oidc != nil\n\tcognitoAuthSet := plugin.Auth.Cognito != nil\n\n\tif basicAuthSet {\n\t\tmsg := \"\"\n\n\t\tisValid := true\n\n\t\tif plugin.Auth.BasicAuth.Username == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"BasicAuth requires username. \"\n\t\t}\n\n\t\tif plugin.Auth.BasicAuth.Password == nil {\n\t\t\tisValid = false\n\t\t\tmsg += \"BasicAuth requires password. \"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\tif oidcAuthSet {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif plugin.Auth.Oidc.OidcAuthorizationEndpoint == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcAuthorizationEndpoint is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OidcIssuer == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcIssuer is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OidcTokenEndpoint == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcTokenEndpoint is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OidcUserInfoEndpoint == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcUserInfoEndpoint is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.CertArn == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CertArn is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OAuthClientId == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OAuthClientId is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OAuthClientSecret == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OAuthClientSecret is required\"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\tif cognitoAuthSet {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif plugin.Auth.Cognito.CognitoAppClientId == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CognitoAppClientId is required\"\n\t\t}\n\n\t\tif plugin.Auth.Cognito.CognitoUserPoolArn == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CognitoUserPoolArn is required\"\n\t\t}\n\n\t\tif plugin.Auth.Cognito.CognitoUserPoolDomain == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CognitoUserPoolDomain is required\"\n\t\t}\n\n\t\tif plugin.Auth.Cognito.CertArn == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CertArn is required\"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\t// return false, \"Either BasicAuth, ODC or Cognito must be set\"\n\t// TODO: BasicAuth is configured to be working in AWS env. Let's add validation back once it's supported.\n\treturn true, \"\"\n\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/aws/v1alpha1/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage v1alpha1\n\nimport (\n\tv1beta1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1beta1\"\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Auth) DeepCopyInto(out *Auth) {\n\t*out = *in\n\tif in.BasicAuth != nil {\n\t\tin, out := &in.BasicAuth, &out.BasicAuth\n\t\t*out = new(BasicAuth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.Oidc != nil {\n\t\tin, out := &in.Oidc, &out.Oidc\n\t\t*out = new(OIDC)\n\t\t**out = **in\n\t}\n\tif in.Cognito != nil {\n\t\tin, out := &in.Cognito, &out.Cognito\n\t\t*out = new(Coginito)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Auth.\nfunc (in *Auth) DeepCopy() *Auth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Auth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *AwsPluginSpec) DeepCopyInto(out *AwsPluginSpec) {\n\t*out = *in\n\tif in.Auth != nil {\n\t\tin, out := &in.Auth, &out.Auth\n\t\t*out = new(Auth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.Roles != nil {\n\t\tin, out := &in.Roles, &out.Roles\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsPluginSpec.\nfunc (in *AwsPluginSpec) DeepCopy() *AwsPluginSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(AwsPluginSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *BasicAuth) DeepCopyInto(out *BasicAuth) {\n\t*out = *in\n\tif in.Password != nil {\n\t\tin, out := &in.Password, &out.Password\n\t\t*out = new(v1beta1.SecretRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuth.\nfunc (in *BasicAuth) DeepCopy() *BasicAuth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(BasicAuth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Coginito) DeepCopyInto(out *Coginito) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Coginito.\nfunc (in *Coginito) DeepCopy() *Coginito {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Coginito)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfAwsPlugin) DeepCopyInto(out *KfAwsPlugin) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfAwsPlugin.\nfunc (in *KfAwsPlugin) DeepCopy() *KfAwsPlugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfAwsPlugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfAwsPlugin) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *OIDC) DeepCopyInto(out *OIDC) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDC.\nfunc (in *OIDC) DeepCopy() *OIDC {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(OIDC)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/gcp/gcp.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage gcp\n"
  },
  {
    "path": "pkg/apis/apps/plugins/gcp/v1alpha1/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1beta1 contains API Schema definitions for the kfdef v1beta1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfdef.apps.kubeflow.org\n\npackage v1alpha1\n"
  },
  {
    "path": "pkg/apis/apps/plugins/gcp/v1alpha1/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the KfGcpPlugin v1alpha1.\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/gcp\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=gcp.plugins.kubeflow.org\npackage v1alpha1\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"gcp.plugins.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfGcpPlugin{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/gcp/v1alpha1/types.go",
    "content": "package v1alpha1\n\nimport (\n\t\"fmt\"\n\tkfdeftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1beta1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// +k8s:openapi-gen=true\n// Placeholder for the plugin API.\ntype KfGcpPlugin struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec GcpPluginSpec `json:\"spec,omitempty\"`\n}\n\n// GcpPlugin defines the extra data provided by the GCP Plugin in KfDef\ntype GcpPluginSpec struct {\n\tAuth *Auth `json:\"auth,omitempty\"`\n\n\t// SAClientId if supplied grant this service account cluster admin access\n\t// TODO(jlewi): Might want to make it a list\n\tSAClientId string `json:\"username,omitempty\"`\n\n\t// CreatePipelinePersistentStorage indicates whether to create storage.\n\t// Use a pointer so we can distinguish unset values.\n\tCreatePipelinePersistentStorage *bool `json:\"createPipelinePersistentStorage,omitempty\"`\n\n\t// EnableWorkloadIdentity indicates whether to enable workload identity.\n\t// Use a pointer so we can distinguish unset values.\n\tEnableWorkloadIdentity *bool `json:\"enableWorkloadIdentity,omitempty\"`\n\n\t// DeploymentManagerConfig provides location of the deployment manager configs.\n\tDeploymentManagerConfig *DeploymentManagerConfig `json:\"deploymentManagerConfig,omitempty\"`\n\n\tProject         string `json:\"project,omitempty\"`\n\tEmail           string `json:\"email,omitempty\"`\n\tIpName          string `json:\"ipName,omitempty\"`\n\tHostname        string `json:\"hostname,omitempty\"`\n\tZone            string `json:\"zone,omitempty\"`\n\tUseBasicAuth    bool   `json:\"useBasicAuth\"`\n\tSkipInitProject bool   `json:\"skipInitProject,omitempty\"`\n\tDeleteStorage   bool   `json:\"deleteStorage,omitempty\"`\n}\n\ntype Auth struct {\n\tBasicAuth *BasicAuth `json:\"basicAuth,omitempty\"`\n\tIAP       *IAP       `json:\"iap,omitempty\"`\n}\n\ntype BasicAuth struct {\n\tUsername string                `json:\"username,omitempty\"`\n\tPassword *kfdeftypes.SecretRef `json:\"password,omitempty\"`\n}\n\ntype IAP struct {\n\tOAuthClientId     string                `json:\"oAuthClientId,omitempty\"`\n\tOAuthClientSecret *kfdeftypes.SecretRef `json:\"oAuthClientSecret,omitempty\"`\n}\n\ntype DeploymentManagerConfig struct {\n\tRepoRef *kfdeftypes.RepoRef `json:\"repoRef,omitempty\"`\n}\n\n// IsValid returns true if the spec is a valid and complete spec.\n// If false it will also return a string providing a message about why its invalid.\nfunc (s *GcpPluginSpec) IsValid() (bool, string) {\n\tif len(s.Hostname) > 63 {\n\t\treturn false, fmt.Sprintf(\"Invaid host name: host name %s is longer than 63 characters. Please shorten the metadata.name.\", s.Hostname)\n\t}\n\tbasicAuthSet := s.Auth.BasicAuth != nil\n\tiapAuthSet := s.Auth.IAP != nil\n\n\tif basicAuthSet == iapAuthSet {\n\t\treturn false, \"Exactly one of BasicAuth and IAP must be set; the other should be nil\"\n\t}\n\n\tif basicAuthSet {\n\t\tmsg := \"\"\n\n\t\tisValid := true\n\n\t\tif s.Auth.BasicAuth.Username == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"BasicAuth requires username. \"\n\t\t}\n\n\t\tif s.Auth.BasicAuth.Password == nil {\n\t\t\tisValid = false\n\t\t\tmsg += \"BasicAuth requires password. \"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\tif iapAuthSet {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif s.Auth.IAP.OAuthClientId == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"IAP requires OAuthClientId. \"\n\t\t}\n\n\t\tif s.Auth.IAP.OAuthClientSecret == nil {\n\t\t\tisValid = false\n\t\t\tmsg += \"IAP requires OAuthClientSecret. \"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\treturn false, \"Either BasicAuth or IAP must be set\"\n}\n\nfunc (p *GcpPluginSpec) GetCreatePipelinePersistentStorage() bool {\n\tif p.CreatePipelinePersistentStorage == nil {\n\t\treturn true\n\t}\n\n\tv := p.CreatePipelinePersistentStorage\n\treturn *v\n}\n\nfunc (p *GcpPluginSpec) GetEnableWorkloadIdentity() bool {\n\tif p.EnableWorkloadIdentity == nil {\n\t\treturn true\n\t}\n\n\tv := p.EnableWorkloadIdentity\n\treturn *v\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/gcp/v1alpha1/types_test.go",
    "content": "package v1alpha1\n\nimport (\n\tkfdeftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1beta1\"\n\tkfutils \"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"testing\"\n)\n\nfunc TestGcpPluginSpec_IsValid(t *testing.T) {\n\n\ttype testCase struct {\n\t\tinput    *GcpPluginSpec\n\t\texpected bool\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\t// Neither IAP or BasicAuth is set\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{},\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\t// Both IAP and BasicAuth set\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tUsername: \"jlewi\",\n\t\t\t\t\t\tPassword: &kfdeftypes.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientId: \"jlewi\",\n\t\t\t\t\t\tOAuthClientSecret: &kfdeftypes.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\n\t\t// Validate basic auth.\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tUsername: \"jlewi\",\n\t\t\t\t\t\tPassword: &kfdeftypes.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tUsername: \"jlewi\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tPassword: &kfdeftypes.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\t\t// End Validate basic auth.\n\t\t// End Validate IAP.\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientId: \"jlewi\",\n\t\t\t\t\t\tOAuthClientSecret: &kfdeftypes.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientId: \"jlewi\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientSecret: &kfdeftypes.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tHostname: \"this-kfApp-name-is-very-long.endpoints.my-gcp-project-for-kubeflow.cloud.goog\",\n\t\t\t},\n\t\t\texpected: false,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tisValid, _ := c.input.IsValid()\n\n\t\t// Test they are equal\n\t\tif isValid != c.expected {\n\t\t\tpSpec := kfutils.PrettyPrint(c.input)\n\t\t\tt.Errorf(\"Spec %v;\\n IsValid Got:%v %v\", pSpec, isValid, c.expected)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/gcp/v1alpha1/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage v1alpha1\n\nimport (\n\tv1beta1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1beta1\"\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Auth) DeepCopyInto(out *Auth) {\n\t*out = *in\n\tif in.BasicAuth != nil {\n\t\tin, out := &in.BasicAuth, &out.BasicAuth\n\t\t*out = new(BasicAuth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.IAP != nil {\n\t\tin, out := &in.IAP, &out.IAP\n\t\t*out = new(IAP)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Auth.\nfunc (in *Auth) DeepCopy() *Auth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Auth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *BasicAuth) DeepCopyInto(out *BasicAuth) {\n\t*out = *in\n\tif in.Password != nil {\n\t\tin, out := &in.Password, &out.Password\n\t\t*out = new(v1beta1.SecretRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuth.\nfunc (in *BasicAuth) DeepCopy() *BasicAuth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(BasicAuth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *DeploymentManagerConfig) DeepCopyInto(out *DeploymentManagerConfig) {\n\t*out = *in\n\tif in.RepoRef != nil {\n\t\tin, out := &in.RepoRef, &out.RepoRef\n\t\t*out = new(v1beta1.RepoRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentManagerConfig.\nfunc (in *DeploymentManagerConfig) DeepCopy() *DeploymentManagerConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(DeploymentManagerConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *GcpPluginSpec) DeepCopyInto(out *GcpPluginSpec) {\n\t*out = *in\n\tif in.Auth != nil {\n\t\tin, out := &in.Auth, &out.Auth\n\t\t*out = new(Auth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.CreatePipelinePersistentStorage != nil {\n\t\tin, out := &in.CreatePipelinePersistentStorage, &out.CreatePipelinePersistentStorage\n\t\t*out = new(bool)\n\t\t**out = **in\n\t}\n\tif in.EnableWorkloadIdentity != nil {\n\t\tin, out := &in.EnableWorkloadIdentity, &out.EnableWorkloadIdentity\n\t\t*out = new(bool)\n\t\t**out = **in\n\t}\n\tif in.DeploymentManagerConfig != nil {\n\t\tin, out := &in.DeploymentManagerConfig, &out.DeploymentManagerConfig\n\t\t*out = new(DeploymentManagerConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GcpPluginSpec.\nfunc (in *GcpPluginSpec) DeepCopy() *GcpPluginSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(GcpPluginSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *IAP) DeepCopyInto(out *IAP) {\n\t*out = *in\n\tif in.OAuthClientSecret != nil {\n\t\tin, out := &in.OAuthClientSecret, &out.OAuthClientSecret\n\t\t*out = new(v1beta1.SecretRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IAP.\nfunc (in *IAP) DeepCopy() *IAP {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(IAP)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfGcpPlugin) DeepCopyInto(out *KfGcpPlugin) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfGcpPlugin.\nfunc (in *KfGcpPlugin) DeepCopy() *KfGcpPlugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfGcpPlugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfGcpPlugin) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/apis/apps/plugins/plugins.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage plugins\n"
  },
  {
    "path": "pkg/apis/kferrors.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage apis\n\nimport (\n\t\"fmt\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\ntype StatusCode int\n\nconst (\n\tOK               StatusCode = 200\n\tINVALID_ARGUMENT StatusCode = 400\n\tNOT_FOUND        StatusCode = 404\n\tINTERNAL_ERROR   StatusCode = 500\n\tUNKNOWN          StatusCode = 520\n)\n\n// KfError stands for Kubeflow error. This is the standard error interface\n// for Kubeflow components.\ntype KfError struct {\n\t// Code is the HTTP response status code.\n\tCode    int    `json:\"code\"`\n\tMessage string `json:\"message,omitempty\"`\n}\n\nfunc (e *KfError) Error() string {\n\treturn fmt.Sprintf(\" (kubeflow.error): Code %d with message: %v\",\n\t\te.Code, e.Message)\n}\n\nfunc IsNotFound(e error) bool {\n\tkfError, ok := e.(*KfError)\n\treturn ok && kfError.Code == int(NOT_FOUND)\n}\n\n// NewKfErrorWithMessage will propogate the error with the given message.\n//\n// TODO(jlewi): Not sure this is the best way to propogate the error messages and turn them\n// into KfErrors. There was a lot of code that was doing this but not asserting that the error\n// was a KfError which was causing segmentation faults so I wrote this helper method.\nfunc NewKfErrorWithMessage(e error, msg string) error {\n\tkErr, ok := e.(*KfError)\n\n\tif !ok {\n\t\tlog.Infof(\"Error is not a KfError; %v\", e)\n\n\t\treturn &KfError{\n\t\t\tCode:    int(UNKNOWN),\n\t\t\tMessage: msg + \"; \" + e.Error(),\n\t\t}\n\t}\n\treturn &KfError{\n\t\tCode:    kErr.Code,\n\t\tMessage: msg + \"; \" + kErr.Message,\n\t}\n}\n"
  },
  {
    "path": "pkg/controller/controller.go",
    "content": "package controller\n\nimport (\n\t\"sigs.k8s.io/controller-runtime/pkg/manager\"\n\n\t\"github.com/kubeflow/kfctl/v3/pkg/controller/kfdef\"\n)\n\n// AddToManager adds all Controllers to the Manager\nfunc AddToManager(m manager.Manager) error {\n\treturn kfdef.AddToManager(m)\n}\n"
  },
  {
    "path": "pkg/controller/kfdef/const.go",
    "content": "package kfdef\n\nimport (\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n)\n\nconst (\n\t// KubeflowLabel represents Label for kfctl deployed resource\n\tKubeflowLabel = \"app.kubernetes.io/managed-by\"\n)\n\nvar (\n\t// watchedResources contains all resources we will watch and reconcile when changed\n\twatchedResources = []schema.GroupVersionKind{\n\t\t{Group: \"rbac.authorization.k8s.io\", Version: \"v1\", Kind: \"ClusterRole\"},\n\t\t{Group: \"rbac.authorization.k8s.io\", Version: \"v1\", Kind: \"ClusterRoleBinding\"},\n\t\t{Group: \"\", Version: \"v1\", Kind: \"ConfigMap\"},\n\t\t{Group: \"apiextensions.k8s.io\", Version: \"v1beta1\", Kind: \"CustomResourceDefinition\"},\n\t\t{Group: \"apps\", Version: \"v1\", Kind: \"DaemonSet\"},\n\t\t{Group: \"apps\", Version: \"v1\", Kind: \"Deployment\"},\n\t\t{Group: \"extensions\", Version: \"v1beta1\", Kind: \"Deployment\"},\n\t\t{Group: \"extensions\", Version: \"v1beta1\", Kind: \"Ingress\"},\n\t\t{Group: \"admissionregistration.k8s.io\", Version: \"v1beta1\", Kind: \"MutatingWebhookConfiguration\"},\n\t\t{Group: \"\", Version: \"v1\", Kind: \"Namespace\"},\n\t\t{Group: \"\", Version: \"v1\", Kind: \"PersistentVolumeClaim\"},\n\t\t{Group: \"rbac.authorization.k8s.io\", Version: \"v1\", Kind: \"Role\"},\n\t\t{Group: \"rbac.authorization.k8s.io\", Version: \"v1beta1\", Kind: \"Role\"},\n\t\t{Group: \"rbac.authorization.k8s.io\", Version: \"v1\", Kind: \"RoleBinding\"},\n\t\t{Group: \"rbac.authorization.k8s.io\", Version: \"v1beta1\", Kind: \"RoleBinding\"},\n\t\t{Group: \"\", Version: \"v1\", Kind: \"Secret\"},\n\t\t{Group: \"\", Version: \"v1\", Kind: \"Service\"},\n\t\t{Group: \"\", Version: \"v1\", Kind: \"ServiceAccount\"},\n\t\t{Group: \"apps\", Version: \"v1\", Kind: \"StatefulSet\"},\n\t\t{Group: \"admissionregistration.k8s.io\", Version: \"v1beta1\", Kind: \"ValidatingWebhookConfiguration\"},\n\t}\n\n\twatchedKubeflowResources = []schema.GroupVersionKind{\n\t\t{Group: \"app.k8s.io\", Version: \"v1beta1\", Kind: \"Application\"},\n\t\t{Group: \"rbac.istio.io\", Version: \"v1alpha1\", Kind: \"ServiceRole\"},\n\t\t{Group: \"rbac.istio.io\", Version: \"v1alpha1\", Kind: \"ServiceRoleBinding\"},\n\t\t{Group: \"networking.istio.io\", Version: \"v1alpha3\", Kind: \"VirtualService\"},\n\t\t{Group: \"argoproj.io\", Version: \"v1alpha1\", Kind: \"Workflow\"},\n\t\t{Group: \"tekton.dev\", Version: \"v1alpha1\", Kind: \"Condition\"},\n\t}\n)\n"
  },
  {
    "path": "pkg/controller/kfdef/kfdef_controller.go",
    "content": "package kfdef\n\nimport (\n\t\"context\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/ghodss/yaml\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tkfdefv1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/coordinator\"\n\tkfloaders \"github.com/kubeflow/kfctl/v3/pkg/kfconfig/loaders\"\n\tkfutils \"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"k8s.io/apimachinery/pkg/api/errors\"\n\t\"k8s.io/apimachinery/pkg/api/meta\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"k8s.io/apimachinery/pkg/util/sets\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"sigs.k8s.io/controller-runtime/pkg/controller\"\n\t\"sigs.k8s.io/controller-runtime/pkg/event\"\n\t\"sigs.k8s.io/controller-runtime/pkg/handler\"\n\t\"sigs.k8s.io/controller-runtime/pkg/manager\"\n\t\"sigs.k8s.io/controller-runtime/pkg/predicate\"\n\t\"sigs.k8s.io/controller-runtime/pkg/reconcile\"\n\t\"sigs.k8s.io/controller-runtime/pkg/source\"\n)\n\nconst (\n\tfinalizer = \"kfdef-finalizer.kfdef.apps.kubeflow.org\"\n\t// finalizerMaxRetries defines the maximum number of attempts to add finalizers.\n\tfinalizerMaxRetries = 10\n)\n\n// kfdefInstances keep all KfDef CRs watched by the operator\nvar kfdefInstances = map[string]struct{}{}\n\n// whether the 2nd controller is added\nvar b2ndController = false\n\n// the manager\nvar kfdefManager manager.Manager\n\n// the stop channel for the 2nd controller\nvar stop chan struct{}\n\n// AddToManager adds all Controllers to the Manager\nfunc AddToManager(m manager.Manager) error {\n\tkfdefManager = m\n\treturn Add(kfdefManager)\n}\n\n// Add creates a new KfDef Controller and adds it to the Manager. The Manager will set fields on the Controller\n// and Start it when the Manager is Started.\nfunc Add(mgr manager.Manager) error {\n\treturn add(mgr, newReconciler(mgr))\n}\n\n// newReconciler returns a new reconcile.Reconciler\nfunc newReconciler(mgr manager.Manager) reconcile.Reconciler {\n\treturn &ReconcileKfDef{client: mgr.GetClient(), scheme: mgr.GetScheme()}\n}\n\n// add adds a new Controller to mgr with r as the reconcile.Reconciler\nfunc add(mgr manager.Manager, r reconcile.Reconciler) error {\n\tlog.Infof(\"Adding controller for kfdef.\")\n\t// Create a new controller\n\tc, err := controller.New(\"kfdef-controller\", mgr, controller.Options{Reconciler: r})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Watch for changes to primary resource KfDef\n\terr = c.Watch(&source.Kind{Type: &kfdefv1.KfDef{}}, &handler.EnqueueRequestsFromMapFunc{\n\t\tToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {\n\t\t\tnamespacedName := types.NamespacedName{Name: a.Meta.GetName(), Namespace: a.Meta.GetNamespace()}\n\t\t\tfinalizers := sets.NewString(a.Meta.GetFinalizers()...)\n\t\t\tif !finalizers.Has(finalizer) {\n\t\t\t\t// assume this is a CREATE event\n\t\t\t\tlog.Infof(\"Adding finalizer %v: %v.\", finalizer, namespacedName)\n\t\t\t\tfinalizers.Insert(finalizer)\n\t\t\t\tinstance := &kfdefv1.KfDef{}\n\t\t\t\terr = mgr.GetClient().Get(context.TODO(), namespacedName, instance)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Errorf(\"Failed to get kfdef CR. Error: %v.\", err)\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tinstance.SetFinalizers(finalizers.List())\n\t\t\t\terr = mgr.GetClient().Update(context.TODO(), instance)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Errorf(\"Failed to update kfdef with finalizer. Error: %v.\", err)\n\t\t\t\t}\n\t\t\t\t// let the UPDATE event request queue\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tlog.Infof(\"Watch a change for KfDef CR: %v.%v.\", a.Meta.GetName(), a.Meta.GetNamespace())\n\t\t\treturn []reconcile.Request{{NamespacedName: namespacedName}}\n\t\t}),\n\t}, kfdefPredicates)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Watch for changes to kfdef resource and requeue the owner KfDef\n\terr = watchKubeflowResources(c, mgr.GetClient(), watchedResources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlog.Infof(\"Controller added to watch on Kubeflow resources with known GVK.\")\n\treturn nil\n}\n\n// watch is monitoring changes for kfctl resources managed by the operator\nfunc watchKubeflowResources(c controller.Controller, r client.Client, watchedResources []schema.GroupVersionKind) error {\n\tfor _, t := range watchedResources {\n\t\tu := &unstructured.Unstructured{}\n\t\tu.SetGroupVersionKind(schema.GroupVersionKind{\n\t\t\tKind:    t.Kind,\n\t\t\tGroup:   t.Group,\n\t\t\tVersion: t.Version,\n\t\t})\n\t\terr := c.Watch(&source.Kind{Type: u}, &handler.EnqueueRequestsFromMapFunc{\n\t\t\tToRequests: handler.ToRequestsFunc(func(a handler.MapObject) []reconcile.Request {\n\t\t\t\tanns := a.Meta.GetAnnotations()\n\t\t\t\tkfdefAnn := strings.Join([]string{kfutils.KfDefAnnotation, kfutils.KfDefInstance}, \"/\")\n\t\t\t\t_, found := anns[kfdefAnn]\n\t\t\t\tif found {\n\t\t\t\t\tkfdefCr := strings.Split(anns[kfdefAnn], \".\")\n\t\t\t\t\tnamespacedName := types.NamespacedName{Name: kfdefCr[0], Namespace: kfdefCr[1]}\n\t\t\t\t\tinstance := &kfdefv1.KfDef{}\n\t\t\t\t\terr := r.Get(context.TODO(), types.NamespacedName{Name: kfdefCr[0], Namespace: kfdefCr[1]}, instance)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tif errors.IsNotFound(err) {\n\t\t\t\t\t\t\t// KfDef CR may have been deleted\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if instance.GetDeletionTimestamp() != nil {\n\t\t\t\t\t\t// KfDef is being deleted\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t\tlog.Infof(\"Watch a change for Kubeflow resource: %v.%v.\", a.Meta.GetName(), a.Meta.GetNamespace())\n\t\t\t\t\treturn []reconcile.Request{{NamespacedName: namespacedName}}\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}),\n\t\t}, ownedResourcePredicates)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Cannot create watch for resources %v %v/%v: %v.\", t.Kind, t.Group, t.Version, err)\n\t\t}\n\t}\n\treturn nil\n}\n\nvar kfdefPredicates = predicate.Funcs{\n\tCreateFunc: func(e event.CreateEvent) bool {\n\t\tobject, _ := meta.Accessor(e.Object)\n\t\tlog.Infof(\"Got create event for %v.%v.\", object.GetName(), object.GetNamespace())\n\t\treturn true\n\t},\n\tGenericFunc: func(e event.GenericEvent) bool {\n\t\tobject, _ := meta.Accessor(e.Object)\n\t\tlog.Infof(\"Got generic event for %v.%v.\", object.GetName(), object.GetNamespace())\n\t\treturn true\n\t},\n\tDeleteFunc: func(e event.DeleteEvent) bool {\n\t\tobject, _ := meta.Accessor(e.Object)\n\t\tlog.Infof(\"Got delete event for %v.%v.\", object.GetName(), object.GetNamespace())\n\t\treturn false\n\t},\n\tUpdateFunc: func(e event.UpdateEvent) bool {\n\t\tobject, _ := meta.Accessor(e.ObjectOld)\n\t\tlog.Infof(\"Got update event for %v.%v.\", object.GetName(), object.GetNamespace())\n\n\t\tupd, _ := meta.Accessor(e.ObjectNew)\n\t\t// these cases will result in a reconcile request\n\t\t// 1. the finalizer is added 2. the deletiontimestamp is added 3. generation is increased\n\t\tif len(object.GetFinalizers()) == 0 && len(upd.GetFinalizers()) > 0 {\n\t\t\treturn true\n\t\t}\n\t\tif object.GetDeletionTimestamp() == nil && upd.GetDeletionTimestamp() != nil {\n\t\t\treturn true\n\t\t}\n\t\tif upd.GetGeneration() > object.GetGeneration() {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t},\n}\n\nvar ownedResourcePredicates = predicate.Funcs{\n\tCreateFunc: func(_ event.CreateEvent) bool {\n\t\t// no action\n\t\treturn false\n\t},\n\tGenericFunc: func(_ event.GenericEvent) bool {\n\t\t// no action\n\t\treturn false\n\t},\n\tDeleteFunc: func(e event.DeleteEvent) bool {\n\t\t// handle deletion event\n\t\tobject, err := meta.Accessor(e.Object)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tlog.Infof(\"Got delete event for %v.%v.\", object.GetName(), object.GetNamespace())\n\t\t// if this object has an owner, let the owner handle the appropriate recovery\n\t\tif len(object.GetOwnerReferences()) > 0 {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t},\n\tUpdateFunc: func(e event.UpdateEvent) bool {\n\t\t// no action\n\t\treturn false\n\t},\n}\n\n// blank assignment to verify that ReconcileKfDef implements reconcile.Reconciler\nvar _ reconcile.Reconciler = &ReconcileKfDef{}\n\n// ReconcileKfDef reconciles a KfDef object\ntype ReconcileKfDef struct {\n\t// This client, initialized using mgr.Client() above, is a split client\n\t// that reads objects from the cache and writes to the apiserver\n\tclient client.Client\n\tscheme *runtime.Scheme\n}\n\n// Reconcile reads that state of the cluster for a KfDef object and makes changes based on the state read\n// and what is in the KfDef.Spec\n// Note:\n// The Controller will requeue the Request to be processed again if the returned error is non-nil or\n// Result.Requeue is true, otherwise upon completion it will remove the work from the queue.\nfunc (r *ReconcileKfDef) Reconcile(request reconcile.Request) (reconcile.Result, error) {\n\tlog.Infof(\"Reconciling KfDef resources. Request.Namespace: %v, Request.Name: %v.\", request.Namespace, request.Name)\n\n\tinstance := &kfdefv1.KfDef{}\n\terr := r.client.Get(context.TODO(), request.NamespacedName, instance)\n\tif err != nil {\n\t\tif errors.IsNotFound(err) {\n\t\t\t// Request object not found, could have been deleted after reconcile request.\n\t\t\t// Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.\n\t\t\t// Return and don't requeue\n\t\t\treturn reconcile.Result{}, nil\n\t\t}\n\t\t// Error reading the object - requeue the request.\n\t\treturn reconcile.Result{}, err\n\t}\n\n\tdeleted := instance.GetDeletionTimestamp() != nil\n\tfinalizers := sets.NewString(instance.GetFinalizers()...)\n\tif deleted {\n\t\tif !finalizers.Has(finalizer) {\n\t\t\tlog.Info(\"Kfdef deleted.\")\n\t\t\treturn reconcile.Result{}, nil\n\t\t}\n\t\tlog.Infof(\"Deleting kfdef.\")\n\n\t\t// stop the 2nd controller\n\t\tif len(kfdefInstances) == 1 {\n\t\t\tclose(stop)\n\t\t\tb2ndController = false\n\t\t}\n\n\t\t// Uninstall Kubeflow\n\t\terr = kfDelete(instance)\n\t\tif err == nil {\n\t\t\tlog.Infof(\"KubeFlow Deployment Deleted.\")\n\t\t} else {\n\t\t\t// log an error and continue for cleanup. It does not make sense to retry the delete.\n\t\t\tlog.Errorf(\"Failed to delete Kubeflow.\")\n\t\t}\n\n\t\t// Delete the kfapp directory\n\t\tkfAppDir := path.Join(\"/tmp\", instance.GetNamespace(), instance.GetName())\n\t\tif err := os.RemoveAll(kfAppDir); err != nil {\n\t\t\tlog.Errorf(\"Failed to delete the app directory. Error: %v.\", err)\n\t\t\treturn reconcile.Result{}, err\n\t\t}\n\t\tlog.Infof(\"kfAppDir deleted.\")\n\n\t\t// Remove this KfDef instance\n\t\tdelete(kfdefInstances, strings.Join([]string{instance.GetName(), instance.GetNamespace()}, \".\"))\n\n\t\t// Remove finalizer once kfDelete is completed.\n\t\tfinalizers.Delete(finalizer)\n\t\tinstance.SetFinalizers(finalizers.List())\n\t\tfinalizerError := r.client.Update(context.TODO(), instance)\n\t\tfor retryCount := 0; errors.IsConflict(finalizerError) && retryCount < finalizerMaxRetries; retryCount++ {\n\t\t\t// Based on Istio operator at https://github.com/istio/istio/blob/master/operator/pkg/controller/istiocontrolplane/istiocontrolplane_controller.go\n\t\t\t// for finalizer removal errors workaround.\n\t\t\tlog.Info(\"Conflict during finalizer removal, retrying.\")\n\t\t\t_ = r.client.Get(context.TODO(), request.NamespacedName, instance)\n\t\t\tfinalizers = sets.NewString(instance.GetFinalizers()...)\n\t\t\tfinalizers.Delete(finalizer)\n\t\t\tinstance.SetFinalizers(finalizers.List())\n\t\t\tfinalizerError = r.client.Update(context.TODO(), instance)\n\t\t}\n\t\tif finalizerError != nil {\n\t\t\tlog.Errorf(\"Error removing finalizer: %v.\", finalizerError)\n\t\t\treturn reconcile.Result{}, finalizerError\n\t\t}\n\t\treturn reconcile.Result{}, nil\n\t} else if !finalizers.Has(finalizer) {\n\t\tlog.Infof(\"Normally this should not happen. Adding finalizer %v: %v.\", finalizer, request)\n\t\tfinalizers.Insert(finalizer)\n\t\tinstance.SetFinalizers(finalizers.List())\n\t\terr = r.client.Update(context.TODO(), instance)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to update kfdef with finalizer. Error: %v.\", err)\n\t\t\treturn reconcile.Result{}, err\n\t\t}\n\t}\n\n\t// If this is a kfdef change, for now, remove the kfapp config path\n\tif request.Name == instance.GetName() && request.Namespace == instance.GetNamespace() {\n\t\tkfAppDir := path.Join(\"/tmp\", instance.GetNamespace(), instance.GetName())\n\t\tif err = os.RemoveAll(kfAppDir); err != nil {\n\t\t\tlog.Errorf(\"Failed to delete the app directory. Error: %v.\", err)\n\t\t\treturn reconcile.Result{}, err\n\t\t}\n\t}\n\n\terr = kfApply(instance)\n\tif err == nil {\n\t\tlog.Infof(\"KubeFlow Deployment Completed.\")\n\n\t\t// add to kfdefInstances if not exists\n\t\tif _, ok := kfdefInstances[strings.Join([]string{instance.GetName(), instance.GetNamespace()}, \".\")]; !ok {\n\t\t\tkfdefInstances[strings.Join([]string{instance.GetName(), instance.GetNamespace()}, \".\")] = struct{}{}\n\t\t}\n\n\t\tif b2ndController == false {\n\t\t\tc, err := controller.New(\"kubeflow-controller\", kfdefManager, controller.Options{Reconciler: r})\n\t\t\tif err != nil {\n\t\t\t\treturn reconcile.Result{}, nil\n\t\t\t}\n\t\t\t// Watch for changes to kfdef resource and requeue the owner KfDef\n\t\t\terr = watchKubeflowResources(c, kfdefManager.GetClient(), watchedKubeflowResources)\n\t\t\tif err != nil {\n\t\t\t\treturn reconcile.Result{}, nil\n\t\t\t}\n\t\t\tstop = make(chan struct{})\n\t\t\tgo func() {\n\t\t\t\t// Start the controller\n\t\t\t\tif err := c.Start(stop); err != nil {\n\t\t\t\t\tlog.Error(err, \"cannot run the 2nd Kubeflow controller\")\n\t\t\t\t}\n\t\t\t}()\n\t\t\tlog.Infof(\"Controller added to watch resources from CRDs created by Kubeflow deployment.\")\n\t\t\tb2ndController = true\n\t\t}\n\t}\n\t// If deployment created successfully - don't requeue\n\treturn reconcile.Result{}, err\n}\n\n// kfApply is equivalent of kfctl apply\nfunc kfApply(instance *kfdefv1.KfDef) error {\n\tlog.Infof(\"Creating a new KubeFlow Deployment. KubeFlow.Namespace: %v.\", instance.Namespace)\n\tkfApp, err := kfLoadConfig(instance, \"apply\")\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to load KfApp. Error: %v.\", err)\n\t\treturn err\n\t}\n\t// Apply kfApp.\n\terr = kfApp.Apply(kftypesv3.K8S)\n\treturn err\n}\n\n// kfDelete is equivalent of kfctl delete\nfunc kfDelete(instance *kfdefv1.KfDef) error {\n\tlog.Infof(\"Uninstall Kubeflow. KubeFlow.Namespace: %v.\", instance.Namespace)\n\tkfApp, err := kfLoadConfig(instance, \"delete\")\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to load KfApp. Error: %v.\", err)\n\t\treturn err\n\t}\n\t// Delete kfApp.\n\terr = kfApp.Delete(kftypesv3.K8S)\n\treturn err\n}\n\nfunc kfLoadConfig(instance *kfdefv1.KfDef, action string) (kftypesv3.KfApp, error) {\n\t// Define kfApp\n\tkfdefBytes, _ := yaml.Marshal(instance)\n\n\t// Make the kfApp directory\n\tkfAppDir := path.Join(\"/tmp\", instance.GetNamespace(), instance.GetName())\n\tif err := os.MkdirAll(kfAppDir, 0755); err != nil {\n\t\tlog.Errorf(\"Failed to create the app directory. Error: %v.\", err)\n\t\treturn nil, err\n\t}\n\n\tconfigFilePath := path.Join(kfAppDir, \"config.yaml\")\n\terr := ioutil.WriteFile(configFilePath, kfdefBytes, 0644)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to write config.yaml. Error: %v.\", err)\n\t\treturn nil, err\n\t}\n\n\tif action == \"apply\" {\n\t\t// Indicate to add annotation to the top level resources\n\t\tsetAnnotationAnn := strings.Join([]string{kfutils.KfDefAnnotation, kfutils.SetAnnotation}, \"/\")\n\t\tsetAnnotations(configFilePath, map[string]string{\n\t\t\tsetAnnotationAnn: \"true\",\n\t\t})\n\t}\n\n\tif action == \"delete\" {\n\t\t// Enable force delete since inClusterConfig has no ./kube/config file to pass the delete safety check.\n\t\tforceDeleteAnn := strings.Join([]string{kfutils.KfDefAnnotation, kfutils.ForceDelete}, \"/\")\n\t\tsetAnnotations(configFilePath, map[string]string{\n\t\t\tforceDeleteAnn: \"true\",\n\t\t})\n\n\t\t// Indicate the Kubeflow is installed by the operator\n\t\tbyOperatorAnn := strings.Join([]string{kfutils.KfDefAnnotation, kfutils.InstallByOperator}, \"/\")\n\t\tsetAnnotations(configFilePath, map[string]string{\n\t\t\tbyOperatorAnn: \"true\",\n\t\t})\n\t}\n\n\tkfApp, err := coordinator.NewLoadKfAppFromURI(configFilePath)\n\tif err != nil {\n\t\tlog.Errorf(\"failed to build kfApp from URI %v: Error: %v.\", configFilePath, err)\n\n\t\treturn nil, err\n\t}\n\treturn kfApp, nil\n}\n\nfunc setAnnotations(configPath string, annotations map[string]string) error {\n\tconfig, err := kfloaders.LoadConfigFromURI(configPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tanns := config.GetAnnotations()\n\tif anns == nil {\n\t\tanns = map[string]string{}\n\t}\n\tfor ann, val := range annotations {\n\t\tanns[ann] = val\n\t}\n\tconfig.SetAnnotations(anns)\n\treturn kfloaders.WriteConfigToFile(*config)\n}\n"
  },
  {
    "path": "pkg/kfapp/aws/OWNERS",
    "content": "approvers:\n  - jeffwan\n  - PatrickXYS\n"
  },
  {
    "path": "pkg/kfapp/aws/aws.go",
    "content": "/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage aws\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"math/rand\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gogo/protobuf/proto\"\n\n\t\"golang.org/x/crypto/bcrypt\"\n\n\tawssdk \"github.com/aws/aws-sdk-go/aws\"\n\t\"github.com/aws/aws-sdk-go/aws/session\"\n\t\"github.com/aws/aws-sdk-go/service/eks\"\n\t\"github.com/aws/aws-sdk-go/service/iam\"\n\t\"github.com/ghodss/yaml\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig/awsplugin\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\tclientset \"k8s.io/client-go/kubernetes\"\n)\n\nconst (\n\tKUBEFLOW_AWS_INFRA_DIR = \"aws_config\"\n\tKUBEFLOW_MANIFEST_DIR  = \"kustomize\"\n\tCLUSTER_CONFIG_FILE    = \"cluster_config.yaml\"\n\tPATH                   = \"path\"\n\tBASIC_AUTH_SECRET      = \"kubeflow-login\"\n\t// Path in manifests repo to where the additional configs are located\n\tCONFIG_LOCAL_PATH = \"aws/infra_configs\"\n\n\tALB_OIDC_SECRET = \"alb-oidc-secret\"\n\n\t// Namespace for istio\n\tIstioNamespace = \"istio-system\"\n\n\t// Plugin parameter constants\n\tAwsPluginName = kfconfig.AWS_PLUGIN_KIND\n\n\tMINIMUM_EKSCTL_VERSION = \"0.1.32\"\n\n\tKUBEFLOW_ADMIN_ROLE_NAME = \"kf-admin-%v-%v\"\n\tKUBEFLOW_USER_ROLE_NAME  = \"kf-user-%v-%v\"\n)\n\n// Aws implements KfApp Interface\n// It includes the KsApp along with additional Aws types\ntype Aws struct {\n\tkfDef     *kfconfig.KfConfig\n\tiamClient *iam.IAM\n\teksClient *eks.EKS\n\tsess      *session.Session\n\tk8sClient *clientset.Clientset\n\n\tcluster *Cluster\n\n\tregion string\n\troles  []string\n\n\tistioManifests       []manifest\n\tingressManifests     []manifest\n\tcertManagerManifests []manifest\n}\n\ntype manifest struct {\n\tname string\n\tpath string\n}\n\n// GetKfApp returns the aws kfapp. It's called by coordinator.GetKfApp\nfunc GetPlatform(kfdef *kfconfig.KfConfig) (kftypes.Platform, error) {\n\t// Manifest lists are used in `Delete` to make sure we track and clean up all the resources.\n\tistioManifests := []manifest{\n\t\t{\n\t\t\tname: \"Istio CRDs\",\n\t\t\tpath: path.Join(KUBEFLOW_MANIFEST_DIR, \"istio-crds\", \"base\", \"crds.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Istio Control Plane\",\n\t\t\tpath: path.Join(KUBEFLOW_MANIFEST_DIR, \"istio-install\", \"base\", \"istio-noauth.yaml\"),\n\t\t},\n\t}\n\n\tingressManifests := []manifest{\n\t\t{\n\t\t\tname: \"ALB Ingress\",\n\t\t\tpath: path.Join(KUBEFLOW_MANIFEST_DIR, \"istio-ingress\", \"base\", \"ingress.yaml\"),\n\t\t},\n\t}\n\tcertManagerManifests := []manifest{\n\t\t{\n\t\t\tname: \"Cert Manager\",\n\t\t\tpath: path.Join(KUBEFLOW_MANIFEST_DIR, \"cert-manager-crds\", \"base\", \"crd.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Cert Manager API Service\",\n\t\t\tpath: path.Join(KUBEFLOW_MANIFEST_DIR, \"cert-manager\", \"base\", \"api-service.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Cert Manager MutationWebhookConfig\",\n\t\t\tpath: path.Join(KUBEFLOW_MANIFEST_DIR, \"cert-manager\", \"base\", \"mutating-webhook-configuration.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Cert Manager ValidatingWebhookConfiguration\",\n\t\t\tpath: path.Join(KUBEFLOW_MANIFEST_DIR, \"cert-manager\", \"base\", \"validating-webhook-configuration.yaml\"),\n\t\t},\n\t}\n\n\t// set aws.sess with shared config file information, such as region\n\tsession := session.Must(session.NewSessionWithOptions(session.Options{\n\t\tSharedConfigState: session.SharedConfigEnable,\n\t}))\n\n\tk8sClient, err := getK8sclient()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t_aws := &Aws{\n\t\tkfDef:                kfdef,\n\t\tsess:                 session,\n\t\tiamClient:            iam.New(session),\n\t\teksClient:            eks.New(session),\n\t\tk8sClient:            k8sClient,\n\t\tistioManifests:       istioManifests,\n\t\tingressManifests:     ingressManifests,\n\t\tcertManagerManifests: certManagerManifests,\n\t}\n\n\treturn _aws, nil\n}\n\n// GetPluginSpec gets the plugin spec.\nfunc (aws *Aws) GetPluginSpec() (*awsplugin.AwsPluginSpec, error) {\n\tawsPluginSpec := &awsplugin.AwsPluginSpec{}\n\terr := aws.kfDef.GetPluginSpec(AwsPluginName, awsPluginSpec)\n\treturn awsPluginSpec, err\n}\n\nfunc (aws *Aws) attachPoliciesToRoles(roles []string) error {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, iamRole := range roles {\n\t\taws.attachIamInlinePolicy(iamRole, \"iam_alb_ingress_policy\",\n\t\t\tfilepath.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR, \"iam_alb_ingress_policy.json\"))\n\t\taws.attachIamInlinePolicy(iamRole, \"iam_profile_controller_policy\",\n\t\t\tfilepath.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR, \"iam_profile_controller_policy.json\"))\n\t\t//aws.attachIamInlinePolicy(iamRole, \"iam_csi_fsx_policy\",\n\t\t//\tfilepath.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR, \"iam_csi_fsx_policy.json\"))\n\t\tif awsPluginSpec.GetEnableNodeGroupLog() {\n\t\t\taws.attachIamInlinePolicy(iamRole, \"iam_cloudwatch_policy\",\n\t\t\t\tfilepath.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR, \"iam_cloudwatch_policy.json\"))\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// TODO: To be implemented. Consider to have EKS cluster config support.\nfunc (aws *Aws) updateEKSClusterConfig() error {\n\treturn nil\n}\n\nfunc (aws *Aws) getWorkerNodeGroupRoles(clusterName string) ([]string, error) {\n\t// List all the roles and figure out nodeGroupWorkerRole\n\tinput := &iam.ListRolesInput{}\n\tlistRolesOutput, err := aws.iamClient.ListRoles(input)\n\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Call not list roles with errors: %v\", err),\n\t\t}\n\t}\n\n\tvar nodeGroupIamRoles []string\n\tfor _, output := range listRolesOutput.Roles {\n\t\tif strings.HasPrefix(*output.RoleName, \"eksctl-\"+clusterName+\"-\") && strings.Contains(*output.RoleName, \"NodeInstanceRole\") {\n\t\t\tnodeGroupIamRoles = append(nodeGroupIamRoles, *output.RoleName)\n\t\t}\n\t}\n\n\treturn nodeGroupIamRoles, nil\n}\n\nfunc copyFile(source string, dest string) error {\n\tfrom, err := os.Open(source)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot open input file for copying: %v\", err),\n\t\t}\n\t}\n\tdefer from.Close()\n\tto, err := os.OpenFile(dest, os.O_RDWR|os.O_CREATE, 0666)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot create dest file %v : %v\", dest, err),\n\t\t}\n\t}\n\tdefer to.Close()\n\t_, err = io.Copy(to, from)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"copy failed source %v dest %v: %v\", source, dest, err),\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// updateClusterConfig replaces placeholders in cluster_config.yaml\nfunc (aws *Aws) updateClusterConfig(clusterConfigFile string) error {\n\tbuf, err := ioutil.ReadFile(clusterConfigFile)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when reading template %v: %v\", clusterConfigFile, err),\n\t\t}\n\t}\n\n\tvar data map[string]interface{}\n\tif err = yaml.Unmarshal(buf, &data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when unmarshaling template %v: %v\", clusterConfigFile, err),\n\t\t}\n\t}\n\n\tres, ok := data[\"metadata\"]\n\tif !ok {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"Invalid cluster config - not able to find metadata entry.\",\n\t\t}\n\t}\n\n\t// Replace placeholder with clusterName and Region\n\tmetadata := res.(map[string]interface{})\n\tmetadata[\"name\"] = aws.kfDef.Name\n\tmetadata[\"region\"] = aws.region\n\tdata[\"metadata\"] = metadata\n\n\tif buf, err = yaml.Marshal(data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when marshaling for %v: %v\", clusterConfigFile, err),\n\t\t}\n\t}\n\tif err = ioutil.WriteFile(clusterConfigFile, buf, 0644); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when writing to %v: %v\", clusterConfigFile, err),\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ${BASE_DIR}/${KFAPP}/aws_config -> destDir (dest)\nfunc (aws *Aws) generateInfraConfigs() error {\n\t// 1. Copy and Paste all files from `sourceDir` to `destDir`\n\trepo, ok := aws.kfDef.GetRepoCache(kftypes.ManifestsRepoName)\n\tif !ok {\n\t\terr := fmt.Errorf(\"Repo %v not found in KfDef.Status.ReposCache\", kftypes.ManifestsRepoName)\n\t\tlog.Errorf(\"%v\", err)\n\t\treturn errors.WithStack(err)\n\t}\n\n\tsourceDir := path.Join(repo.LocalPath, CONFIG_LOCAL_PATH)\n\tdestDir := path.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR)\n\n\tif _, err := os.Stat(destDir); os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating AWS infrastructure configs in directory %v\", destDir)\n\t\tdestDirErr := os.MkdirAll(destDir, os.ModePerm)\n\t\tif destDirErr != nil {\n\t\t\treturn destDirErr\n\t\t}\n\t} else {\n\t\tlog.Infof(\"AWS infrastructure configs already exist in directory %v\", destDir)\n\t}\n\n\t// List all the files under source directory\n\tfiles, err := ioutil.ReadDir(sourceDir)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, file := range files {\n\t\tsourceFile := filepath.Join(sourceDir, file.Name())\n\t\tdestFile := filepath.Join(destDir, file.Name())\n\t\tcopyErr := copyFile(sourceFile, destFile)\n\t\tif copyErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: copyErr.(*kfapis.KfError).Code,\n\t\t\t\tMessage: fmt.Sprintf(\"Could not copy %v to %v: %v\",\n\t\t\t\t\tsourceFile, destFile, copyErr.(*kfapis.KfError).Message),\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Reading from cluster_config.yaml and replace placeholders with values in aws.kfDef.Spec.\n\tclusterConfigFile := filepath.Join(destDir, CLUSTER_CONFIG_FILE)\n\tif err := aws.updateClusterConfig(clusterConfigFile); err != nil {\n\t\treturn err\n\t}\n\n\t// 3. Update managed_cluster\n\t// @Deprecated. Don't need to update the field, we add configs part of awsPluginSpec. It's false by default\n\treturn nil\n}\n\nfunc (aws *Aws) generateBasicAuthPasswordHash() (string, error) {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif awsPluginSpec.Auth == nil || awsPluginSpec.Auth.BasicAuth == nil || awsPluginSpec.Auth.BasicAuth.Password == \"\" {\n\t\terr := errors.WithStack(fmt.Errorf(\"BasicAuth.Password must be set if enabled BasicAuth\"))\n\t\treturn \"\", err\n\t}\n\n\tencodedPassword, err := base64EncryptPassword(awsPluginSpec.Auth.BasicAuth.Password)\n\tif err != nil {\n\t\tlog.Errorf(\"There was a problem encrypting the password; %v\", err)\n\t\treturn \"\", err\n\t}\n\n\treturn encodedPassword, nil\n}\n\nfunc base64EncryptPassword(password string) (string, error) {\n\tpasswordHash, err := bcrypt.GenerateFromPassword([]byte(password), 10)\n\tif err != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when hashing password: %v\", err),\n\t\t}\n\t}\n\tencodedPassword := base64.StdEncoding.EncodeToString(passwordHash)\n\n\treturn encodedPassword, nil\n}\n\n// Init initializes aws kfapp - platform\nfunc (aws *Aws) Init(resources kftypes.ResourceEnum) error {\n\t// 1. Use AWS SDK to check if credentials from (~/.aws/credentials or ENV) and session verify\n\tcommandsTocheck := []string{\"aws\", \"aws-iam-authenticator\", \"eksctl\"}\n\tfor _, command := range commandsTocheck {\n\t\tif err := utils.CheckCommandExist(command); err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Could not find command %v in PATH\", command),\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Check if current eksctl version meets minimum requirement\n\tversion, err := utils.GetEksctlVersion()\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Can not run eksctl version %v\", err),\n\t\t}\n\t}\n\n\tif lessThan, err := isEksctlVersionLessThan(version, MINIMUM_EKSCTL_VERSION); err != nil || lessThan {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"eksctl version has to be great than %s %v\", MINIMUM_EKSCTL_VERSION, err),\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Generate generate aws infrastructure configs and aws kfapp manifest\n// Remind: Need to be thread-safe: this entry is share among kfctl and deploy app\nfunc (aws *Aws) Generate(resources kftypes.ResourceEnum) error {\n\tawsDir := path.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR)\n\tif _, err := os.Stat(awsDir); err == nil {\n\t\tlog.Infof(\"Folder %v exists, skip aws.Generate\", awsDir)\n\t\treturn nil\n\t} else if !os.IsNotExist(err) {\n\t\tlog.Errorf(\"Stat folder %v error: %v; trying to delete it...\", awsDir, err)\n\t\t_ = os.RemoveAll(awsDir)\n\t}\n\n\t// Use aws sts get-caller-identity to verify aws credential setting\n\tif err := utils.CheckAwsStsCallerIdentity(aws.sess); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Could not authenticate aws client: %v, Please make sure you set up AWS credentials and regions\", err),\n\t\t}\n\t}\n\n\tif setAwsPluginDefaultsErr := aws.setAwsPluginDefaults(); setAwsPluginDefaultsErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: setAwsPluginDefaultsErr.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"set aws plugin defaults: %v\",\n\t\t\t\tsetAwsPluginDefaultsErr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\tif awsConfigFilesErr := aws.generateInfraConfigs(); awsConfigFilesErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: awsConfigFilesErr.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Could not generate cluster configs under %v Error: %v\",\n\t\t\t\tKUBEFLOW_AWS_INFRA_DIR, awsConfigFilesErr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\tpluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tif err := aws.kfDef.SetApplicationParameter(\"aws-alb-ingress-controller\", \"cluster-name\", aws.kfDef.Name); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tif pluginSpec.Auth != nil && pluginSpec.Auth.BasicAuth != nil && pluginSpec.Auth.BasicAuth.Password != \"\" {\n\t\tif err := aws.kfDef.SetApplicationParameter(\"dex\", \"static_email\", pluginSpec.Auth.BasicAuth.Username); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif encodedPasswordHash, err := aws.generateBasicAuthPasswordHash(); err == nil {\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"dex\", \"static_password_hash\", encodedPasswordHash); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t} else {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t} else {\n\t\tif pluginSpec.Auth.Cognito != nil {\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"CognitoUserPoolArn\", pluginSpec.Auth.Cognito.CognitoUserPoolArn); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"CognitoUserPoolDomain\", pluginSpec.Auth.Cognito.CognitoUserPoolDomain); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"CognitoAppClientId\", pluginSpec.Auth.Cognito.CognitoAppClientId); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"certArn\", pluginSpec.Auth.Cognito.CertArn); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t}\n\n\t\t// By default we use cognito overlay in manifest, remove cognito and add oidc overlay if this is enabled.\n\t\tif pluginSpec.Auth.Oidc != nil {\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio\", \"clusterRbacConfig\", \"ON\"); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.RemoveApplicationOverlay(\"istio-ingress\", \"cognito\"); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.AddApplicationOverlay(\"istio-ingress\", \"oidc\"); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"oidcIssuer\", pluginSpec.Auth.Oidc.OidcIssuer); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"oidcAuthorizationEndpoint\", pluginSpec.Auth.Oidc.OidcAuthorizationEndpoint); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"oidcTokenEndpoint\", pluginSpec.Auth.Oidc.OidcTokenEndpoint); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"oidcUserInfoEndpoint\", pluginSpec.Auth.Oidc.OidcUserInfoEndpoint); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"certArn\", pluginSpec.Auth.Oidc.CertArn); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\t//TODO: consider to use secret from secretGenerator?\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"istio-ingress\", \"oidcSecretName\", ALB_OIDC_SECRET); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Special handling for cloud watch logs of worker node groups\n\tif pluginSpec.GetEnableNodeGroupLog() {\n\t\t//aws.kfDef.Spec.Components = append(aws.kfDef.Spec.Components, \"fluentd-cloud-watch\")\n\t\tif err := aws.kfDef.SetApplicationParameter(\"fluentd-cloud-watch\", \"clusterName\", aws.kfDef.Name); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif err := aws.kfDef.SetApplicationParameter(\"fluentd-cloud-watch\", \"region\", aws.region); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t}\n\n\t// Special handling for managed SQL service\n\tif pluginSpec.ManagedRelationDatabase != nil {\n\t\t// Setup metadata -> remove `db` overlay, add `external-mysql` overlay\n\t\tif err := aws.kfDef.RemoveApplicationOverlay(\"metadata\", \"db\"); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tif err := aws.kfDef.AddApplicationOverlay(\"metadata\", \"external-mysql\"); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\t// add external-mysql to pipeline/api-service and external-mysql to metadata,\n\t\tif err := aws.kfDef.SetApplicationParameter(\"metadata\", \"MYSQL_HOST\", pluginSpec.ManagedRelationDatabase.Host); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tif err := aws.kfDef.SetApplicationParameter(\"metadata\", \"MYSQL_USERNAME\", string(pluginSpec.ManagedRelationDatabase.Username)); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tif err := aws.kfDef.SetApplicationParameter(\"metadata\", \"MYSQL_ROOT_PASSWORD\", string(pluginSpec.ManagedRelationDatabase.Password)); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tif pluginSpec.ManagedRelationDatabase.Port != nil {\n\t\t\tif err := aws.kfDef.SetApplicationParameter(\"metadata\", \"MYSQL_PORT\", fmt.Sprint(*pluginSpec.ManagedRelationDatabase.Port)); err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t}\n\n\t\t// Setup pipeline/api-service -> move mysql application, add external-mysql overlay to pipeline/api-service\n\t\tif err := aws.kfDef.DeleteApplication(\"mysql\"); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tif err := aws.kfDef.AddApplicationOverlay(\"api-service\", \"external-mysql\"); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\t// add external-mysql to pipeline/api-service and external-mysql to metadata,\n\t\tif err := aws.kfDef.SetApplicationParameter(\"api-service\", \"mysqlHost\", pluginSpec.ManagedRelationDatabase.Host); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tif err := aws.kfDef.SetApplicationParameter(\"api-service\", \"mysqlUser\", pluginSpec.ManagedRelationDatabase.Username); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tif err := aws.kfDef.SetApplicationParameter(\"api-service\", \"mysqlPassword\", pluginSpec.ManagedRelationDatabase.Password); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t}\n\n\t// Special handling for managed object storage\n\tif pluginSpec.ManagedObjectStorage != nil {\n\t\t// TODO: replace worker-controller, pipeline, etc layer\n\t}\n\n\t// Special handling for sparkakus\n\trand.Seed(time.Now().UnixNano())\n\tif err := aws.kfDef.SetApplicationParameter(\"spartakus\", \"usageId\", strconv.Itoa(rand.Int())); err != nil {\n\t\tif kfconfig.IsAppNotFound(err) {\n\t\t\tlog.Infof(\"Spartakus not included; not setting usageId\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (aws *Aws) setAwsPluginDefaults() error {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif isValid, msg := awsPluginSpec.IsValid(); !isValid {\n\t\tlog.Errorf(\"AwsPluginSpec isn't valid; error %v\", msg)\n\t\treturn fmt.Errorf(msg)\n\t}\n\n\taws.region = awsPluginSpec.Region\n\taws.roles = awsPluginSpec.Roles\n\n\tif awsPluginSpec.ManagedCluster == nil {\n\t\tawsPluginSpec.ManagedCluster = proto.Bool(awsPluginSpec.GetManagedCluster())\n\t\tlog.Infof(\"ManagedCluster set defaulting to %v\", utils.PrettyPrint(*awsPluginSpec.ManagedCluster))\n\t}\n\n\tif awsPluginSpec.EnablePodIamPolicy == nil {\n\t\tawsPluginSpec.EnablePodIamPolicy = proto.Bool(awsPluginSpec.GetEnablePodIamPolicy())\n\t\tlog.Infof(\"EnablePodIamPolicy set defaulting to %v\", utils.PrettyPrint(*awsPluginSpec.EnablePodIamPolicy))\n\t}\n\n\tif awsPluginSpec.EnableNodeGroupLog == nil {\n\t\tawsPluginSpec.EnableNodeGroupLog = proto.Bool(awsPluginSpec.GetEnableNodeGroupLog())\n\t\tlog.Infof(\"EnableNodeGroupLog set defaulting to %v\", utils.PrettyPrint(*awsPluginSpec.EnableNodeGroupLog))\n\t}\n\n\tif awsPluginSpec.Auth == nil {\n\t\tawsPluginSpec.Auth = &awsplugin.Auth{}\n\t}\n\n\treturn nil\n}\n\n// Apply create eks cluster if needed, bind IAM policy to node group roles and enable cluster level configs.\n// Remind: Need to be thread-safe: this entry is share among kfctl and deploy app\nfunc (aws *Aws) Apply(resources kftypes.ResourceEnum) error {\n\t// use aws sts get-caller-identity to verify aws credential works.\n\tif err := utils.CheckAwsStsCallerIdentity(aws.sess); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Could not authenticate aws client: %v, Please make sure you set up AWS credentials and regions\", err),\n\t\t}\n\t}\n\n\tif err := aws.setAwsPluginDefaults(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"aws set aws plugin defaults: %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 1. Create EKS cluster if needed\n\tif err := aws.createEKSCluster(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Failed to create EKS cluster %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 2. For non-eks cluster (kops) or user doesn't enable pod level IAM policy,\n\t// attach IAM policies like ALB, FSX, EFS, cloudWatch Fluentd to worker node group roles\n\t// For eks cluster enable pod IAM, we create identity provider and role. Override kubeflow components service account with annotation.\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Could not get awsPluginSpec %v\", err),\n\t\t}\n\t}\n\n\tisEksCluster, err := aws.IsEksCluster(aws.kfDef.Name)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Could not determinte it's EKS cluster %v\", err),\n\t\t}\n\t}\n\n\tif err := createNamespace(aws.k8sClient, aws.kfDef.Namespace); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Could not create namespace %v\", err),\n\t\t}\n\t}\n\n\tif err := createNamespace(aws.k8sClient, IstioNamespace); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Could not create namespace %v\", err),\n\t\t}\n\t}\n\n\t// Create IAM role binding for k8s service account.\n\tif awsPluginSpec.GetEnablePodIamPolicy() && isEksCluster {\n\t\terr := aws.setupIamRoleForServiceAccount()\n\t\tif err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Could not setup pod IAM policy %v\", err),\n\t\t\t}\n\t\t}\n\t} else if awsPluginSpec.GetEnablePodIamPolicy() {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"IAM for Service Account is not supported on non-EKS cluster %v\", err),\n\t\t}\n\t}\n\n\t// 3. Attach policies to worker node groups. This will be used by both EKS and non-EKS AWS Kubernetes clusters.\n\tif err := aws.attachPoliciesToRoles(aws.roles); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Failed to attach IAM policies %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 4. Update cluster configs to enable master log or private access config.\n\tif err := aws.updateEKSClusterConfig(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Failed to update eks cluster configs %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 5. Setup OIDC create OIDC secret for ALB\n\tif err := aws.setupOIDC(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Failed to update create OIDC secret for ALB %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (aws *Aws) Delete(resources kftypes.ResourceEnum) error {\n\t// use aws to call sts get-caller-identity to verify aws credential works.\n\tif err := utils.CheckAwsStsCallerIdentity(aws.sess); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Could not authenticate aws client: %v, Please make sure you set up AWS credentials and regions\", err),\n\t\t}\n\t}\n\n\tsetAwsPluginDefaultsErr := aws.setAwsPluginDefaults()\n\tif setAwsPluginDefaultsErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: setAwsPluginDefaultsErr.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"aws set aws plugin defaults: %v\",\n\t\t\t\tsetAwsPluginDefaultsErr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 1. Delete ingress and istio, cert-manager dependencies\n\tif err := aws.uninstallK8sDependencies(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Could not uninstall eks cluster Error: %v\", err.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 2. Detach inline policies from worker IAM Roles\n\tif err := aws.detachPoliciesFromWorkerRoles(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Could not detach iam role Error: %v\", err.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 3. Delete WebIdentityIAMRole and OIDC Provider and pre-configured roles\n\tif err := aws.deleteWebIdentityRolesAndProvider(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Could not detach iam role Error: %v\", err.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\t// 4. Delete EKS cluster\n\tif err := aws.deleteEKSCluster(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Could not uninstall eks cluster Error: %v\", err.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (aws *Aws) Dump(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\n// uninstallK8sDependencies delete istio-ingress, istio and cert-manager dependencies.\nfunc (aws *Aws) uninstallK8sDependencies() error {\n\trev := func(manifests []manifest) []manifest {\n\t\tvar r []manifest\n\t\tmax := len(manifests)\n\t\tfor i := 0; i < max; i++ {\n\t\t\tr = append(r, manifests[max-1-i])\n\t\t}\n\t\treturn r\n\t}\n\n\t// 1. Delete Ingress and wait for 15s for alb-ingress-controller to clean up resources\n\tif err := deleteManifests(rev(aws.ingressManifests)); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tvar albCleanUpInSeconds = 15\n\tlog.Infof(\"Wait for %d seconds for alb ingress controller to clean up ALB\", albCleanUpInSeconds)\n\ttime.Sleep(time.Duration(albCleanUpInSeconds) * time.Second)\n\n\t// 2. Delete cert-manager manifest.\n\t// Simplify process by deleting cert-manager namespace, don't have to delete every single manifest\n\tif err := deleteNamespace(aws.k8sClient, \"cert-manager\"); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tif err := deleteManifests(rev(aws.certManagerManifests)); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\t// 3. Delete istio dependencies\n\tif err := deleteManifests(rev(aws.istioManifests)); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\treturn nil\n}\n\nfunc deleteManifests(manifests []manifest) error {\n\tconfig := kftypes.GetConfig()\n\tfor _, m := range manifests {\n\t\tlog.Infof(\"Deleting %s...\", m.name)\n\t\tif _, err := os.Stat(m.path); os.IsNotExist(err) {\n\t\t\tlog.Warnf(\"File %s not found\", m.path)\n\t\t\tcontinue\n\t\t}\n\t\terr := utils.DeleteResourceFromFile(\n\t\t\tconfig,\n\t\t\tm.path,\n\t\t)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to delete %s: %+v\", m.name, err)\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (aws *Aws) detachPoliciesFromWorkerRoles() error {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tvar roles []string\n\teksCluster, err := aws.getEksCluster(aws.kfDef.Name)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif awsPluginSpec.GetEnablePodIamPolicy() {\n\t\t// no matter it's managed or self-managed cluster, we setup kf-admin roles.\n\t\troles = append(roles, fmt.Sprintf(KUBEFLOW_ADMIN_ROLE_NAME, aws.region, eksCluster.name))\n\t} else {\n\t\t// Find worker roles based on new cluster kfctl created or existing cluster\n\t\tif awsPluginSpec.GetManagedCluster() {\n\t\t\tworkerRoles, err := aws.getWorkerNodeGroupRoles(aws.kfDef.Name)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t\troles = workerRoles\n\t\t} else {\n\t\t\troles = awsPluginSpec.Roles\n\t\t}\n\t}\n\n\t// Detach IAM Policies\n\tfor _, iamRole := range roles {\n\t\taws.deleteIamRolePolicy(iamRole, \"iam_alb_ingress_policy\")\n\t\taws.deleteIamRolePolicy(iamRole, \"iam_profile_controller_policy\")\n\n\t\t// TODO: use Addon to check permissions\n\t\t// aws.deleteIamRolePolicy(iamRole, \"iam_csi_fsx_policy\")\n\t\tif awsPluginSpec.GetEnableNodeGroupLog() {\n\t\t\taws.deleteIamRolePolicy(iamRole, \"iam_cloudwatch_policy\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// deleteIamRolePolicy detach inline policy from the role\nfunc (aws *Aws) deleteIamRolePolicy(roleName, policyName string) error {\n\tlog.Infof(\"Deleting inline policy %s for iam role %s\", policyName, roleName)\n\n\tinput := &iam.DeleteRolePolicyInput{\n\t\tPolicyName: awssdk.String(policyName),\n\t\tRoleName:   awssdk.String(roleName),\n\t}\n\n\t_, err := aws.iamClient.DeleteRolePolicy(input)\n\t// This error can be skipped and should not block delete process.\n\t// It's possible user make any changes on IAM role.\n\tif err != nil {\n\t\tlog.Warnf(\"Unable to delete iam inline policy %s because %v\", policyName, err.Error())\n\t}\n\n\treturn nil\n}\n\n// attachIamInlinePolicy attach inline policy to IAM role\nfunc (aws *Aws) attachIamInlinePolicy(roleName, policyName, policyDocumentPath string) error {\n\tlog.Infof(\"Attaching inline policy %s for iam role %s\", policyName, roleName)\n\tpolicyDocumentJSONBytes, _ := ioutil.ReadFile(policyDocumentPath)\n\n\tinput := &iam.PutRolePolicyInput{\n\t\tPolicyDocument: awssdk.String(string(policyDocumentJSONBytes)),\n\t\tPolicyName:     awssdk.String(policyName),\n\t\tRoleName:       awssdk.String(roleName),\n\t}\n\n\t_, err := aws.iamClient.PutRolePolicy(input)\n\tif err != nil {\n\t\tlog.Warnf(\"Unable to attach iam inline policy %s because %v\", policyName, err.Error())\n\t\treturn nil\n\t}\n\n\tlog.Infof(\"Successfully attach policy to IAM Role %v\", roleName)\n\treturn nil\n}\n\n// setupIamRoleForServiceAccount will create/reuse IAM identity provider and create/reuse web identity role.\nfunc (aws *Aws) setupIamRoleForServiceAccount() error {\n\teksCluster, err := aws.getEksCluster(aws.kfDef.Name)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\taccountId, err := utils.CheckAwsAccountId(aws.sess)\n\tif err != nil {\n\t\treturn errors.Errorf(\"Can not find accountId for cluster %v\", aws.kfDef.Name)\n\t}\n\n\t// Create Identity Provider.\n\tissuerURLWithoutProtocol := eksCluster.oidcIssuerUrl[len(\"https://\"):]\n\texist, arn, err := aws.checkIdentityProviderExists(accountId, issuerURLWithoutProtocol)\n\tif err != nil {\n\t\treturn errors.Errorf(\"Can not check identity provider existence: %v\", err)\n\t}\n\n\toidcProviderArn := arn\n\tif !exist {\n\t\tarn, err := aws.createIdentityProvider(eksCluster.oidcIssuerUrl)\n\t\tif err != nil {\n\t\t\treturn errors.Errorf(\"Can not check identity provider existence: %v\", err)\n\t\t}\n\t\toidcProviderArn = arn\n\t}\n\n\tkubeflowAdminRoleName := fmt.Sprintf(KUBEFLOW_ADMIN_ROLE_NAME, aws.region, eksCluster.name)\n\tkubeflowUserRoleName := fmt.Sprintf(KUBEFLOW_USER_ROLE_NAME, aws.region, eksCluster.name)\n\n\t// Link service account, role and policy\n\tkubeflowSAIamRoleMapping := map[string]string{\n\t\t\"kf-admin\":                            kubeflowAdminRoleName,\n\t\t\"alb-ingress-controller\":              kubeflowAdminRoleName,\n\t\t\"profiles-controller-service-account\": kubeflowAdminRoleName,\n\t\t\"fluentd\":                             kubeflowAdminRoleName,\n\t\t\"kf-user\":                             kubeflowUserRoleName,\n\t}\n\n\tfor ksa, iamRoleName := range kubeflowSAIamRoleMapping {\n\t\t// 1. Create AWS IAM Roles with web identity provider as trusted identities\n\t\tif err := aws.createOrUpdateWebIdentityRole(oidcProviderArn, issuerURLWithoutProtocol, iamRoleName, aws.kfDef.Namespace, ksa); err != nil {\n\t\t\treturn errors.Errorf(\"Can not create web identity role: %v\", err)\n\t\t}\n\n\t\t// 2. Create Kubernetes Service Account\n\t\tiamRoleArn := fmt.Sprintf(AWS_IAM_ROLE_ARN, accountId, iamRoleName)\n\t\tif err := aws.createOrUpdateK8sServiceAccount(aws.k8sClient, aws.kfDef.Namespace, ksa, iamRoleArn); err != nil {\n\t\t\treturn errors.Errorf(\"Can not create Service Account %s/%s, %v\", aws.kfDef.Namespace, ksa, err)\n\t\t}\n\n\t\t// 3. Link KSA to IAM Role - add service account in Role Trust Relationships\n\t\tif err := aws.updateRoleTrustIdentity(iamRoleName, aws.kfDef.Namespace, ksa); err != nil {\n\t\t\treturn errors.Errorf(\"Can not update IAM role trust relationships %v\", err)\n\t\t}\n\t}\n\n\t// We only want to attach admin role at this moment.\n\t// Grant kf-user policies later, based on the potential actions use may have, like ECR access, S3 access, etc.\n\taws.roles = append(aws.roles, fmt.Sprintf(KUBEFLOW_ADMIN_ROLE_NAME, aws.region, eksCluster.name))\n\treturn nil\n}\n\nfunc (aws *Aws) deleteWebIdentityRolesAndProvider() error {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tif !awsPluginSpec.GetEnablePodIamPolicy() {\n\t\tlog.Infof(\"Pod IAM Policy is not set, skip delete web identity provider\")\n\t\treturn nil\n\t}\n\n\teksCluster, err := aws.getEksCluster(aws.kfDef.Name)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Delete IAM role we created\n\tkfAdminRoleName := fmt.Sprintf(KUBEFLOW_ADMIN_ROLE_NAME, aws.region, eksCluster.name)\n\tkfUserRoleName := fmt.Sprintf(KUBEFLOW_USER_ROLE_NAME, aws.region, eksCluster.name)\n\taws.deleteIAMRole(kfAdminRoleName)\n\taws.deleteIAMRole(kfUserRoleName)\n\tlog.Infof(\"IAM Role %s, %s has been deleted\", kfAdminRoleName, kfUserRoleName)\n\n\taccountId, err := utils.CheckAwsAccountId(aws.sess)\n\tif err != nil {\n\t\treturn errors.Errorf(\"Can not find accountId for cluster %v\", aws.kfDef.Name)\n\t}\n\n\t// Delete oidc web identity provider\n\tissuerURLWithoutProtocol := eksCluster.oidcIssuerUrl[len(\"https://\"):]\n\texist, arn, err := aws.checkIdentityProviderExists(accountId, issuerURLWithoutProtocol)\n\tif err != nil {\n\t\treturn errors.Errorf(\"Can not check identity provider existence: %v\", err)\n\t}\n\n\tif !exist {\n\t\tlog.Warnf(\"Identity provider %v of cluster %v does not exist\", arn, eksCluster.name)\n\t\treturn nil\n\t}\n\n\tif err := aws.DeleteIdentityProvider(arn); err != nil {\n\t\treturn err\n\t}\n\n\tlog.Infof(\"OIDC Identity Provider has been delete %s\", issuerURLWithoutProtocol)\n\n\treturn nil\n}\n\n// setupOIDC creates secret for ALB ingress controller\nfunc (aws *Aws) setupOIDC() error {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif awsPluginSpec.Auth.Oidc != nil {\n\t\t// Create OIDC Secret from clientId and clientSecret.\n\t\t_, err = aws.k8sClient.CoreV1().Secrets(IstioNamespace).Get(ALB_OIDC_SECRET, metav1.GetOptions{})\n\t\tif err == nil {\n\t\t\tlog.Warnf(\"Secret %v already exists...\", ALB_OIDC_SECRET)\n\t\t\treturn nil\n\t\t}\n\n\t\t// This secret need to be in istio-system, same namespace as istio-ingress\n\t\treturn createSecret(aws.k8sClient, ALB_OIDC_SECRET, IstioNamespace, map[string][]byte{\n\t\t\t\"clientId\":     []byte(awsPluginSpec.Auth.Oidc.OAuthClientId),\n\t\t\t\"clientSecret\": []byte(awsPluginSpec.Auth.Oidc.OAuthClientSecret),\n\t\t})\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfapp/aws/eks.go",
    "content": "package aws\n\nimport (\n\t\"fmt\"\n\tawssdk \"github.com/aws/aws-sdk-go/aws\"\n\t\"github.com/aws/aws-sdk-go/aws/awserr\"\n\t\"github.com/aws/aws-sdk-go/service/eks\"\n\tversionChecker \"github.com/hashicorp/go-version\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"os/exec\"\n\t\"path/filepath\"\n)\n\ntype Cluster struct {\n\tname              string\n\tapiServerEndpoint string\n\toidcIssuerUrl     string\n\tclusterArn        string\n\troleArn           string\n\tkubernetesVersion string\n}\n\n// getEksCluster obtain detail info of an eks cluster\nfunc (aws *Aws) getEksCluster(clusterName string) (*Cluster, error) {\n\tinput := &eks.DescribeClusterInput{\n\t\tName: awssdk.String(clusterName),\n\t}\n\n\tresult, err := aws.eksClient.DescribeCluster(input)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcluster := &Cluster{\n\t\tname:              awssdk.StringValue(result.Cluster.Name),\n\t\tapiServerEndpoint: awssdk.StringValue(result.Cluster.Endpoint),\n\t\toidcIssuerUrl:     awssdk.StringValue(result.Cluster.Identity.Oidc.Issuer),\n\t\tclusterArn:        awssdk.StringValue(result.Cluster.Arn),\n\t\troleArn:           awssdk.StringValue(result.Cluster.RoleArn),\n\t\tkubernetesVersion: awssdk.StringValue(result.Cluster.Version),\n\t}\n\n\treturn cluster, nil\n}\n\n// IsEksCluster checks if an AWS cluster is EKS cluster.\nfunc (aws *Aws) IsEksCluster(clusterName string) (bool, error) {\n\tinput := &eks.DescribeClusterInput{\n\t\tName: awssdk.String(clusterName),\n\t}\n\n\texist := true\n\tif _, err := aws.eksClient.DescribeCluster(input); err != nil {\n\t\tif aerr, ok := err.(awserr.Error); ok {\n\t\t\tif aerr.Code() != eks.ErrCodeResourceNotFoundException {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t\texist = false\n\t\t}\n\t}\n\n\treturn exist, nil\n}\n\n// createEKSCluster creates a new EKS cluster if want kfctl to manage cluster\n// @Deprecated. In order to simplify workflow, user should always brings their own cluster and install kubeflow on top of it.\n// We still leave this option here and probably remove codes in future version\nfunc (aws *Aws) createEKSCluster() error {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif awsPluginSpec.GetManagedCluster() {\n\t\tlog.Infoln(\"Start to create eks cluster. Please wait for 10-15 mins...\")\n\t\tclusterConfigFile := filepath.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR, CLUSTER_CONFIG_FILE)\n\t\toutput, err := exec.Command(\"eksctl\", \"create\", \"cluster\", \"--config-file=\"+clusterConfigFile).Output()\n\t\tif err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Call 'eksctl create cluster --config-file=%s' with errors: %v\", clusterConfigFile, string(output)),\n\t\t\t}\n\t\t}\n\t\tlog.Infoln(string(output))\n\n\t\tnodeGroupIamRoles, getRoleError := aws.getWorkerNodeGroupRoles(aws.kfDef.Name)\n\t\tif getRoleError != nil {\n\t\t\treturn errors.WithStack(getRoleError)\n\t\t}\n\n\t\taws.roles = nodeGroupIamRoles\n\t} else {\n\t\tlog.Infof(\"You already have cluster setup. Skip creating new eks cluster. \")\n\t}\n\n\treturn nil\n}\n\n// deleteEKSCluster deletes eks cluster if current cluster is a managed cluster\nfunc (aws *Aws) deleteEKSCluster() error {\n\tawsPluginSpec, err := aws.GetPluginSpec()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Delete cluster if it's a managed cluster created by kfctl\n\tif awsPluginSpec.GetManagedCluster() {\n\t\tlog.Infoln(\"Start to delete eks cluster. Please wait for 5 mins...\")\n\t\tclusterConfigFile := filepath.Join(aws.kfDef.Spec.AppDir, KUBEFLOW_AWS_INFRA_DIR, CLUSTER_CONFIG_FILE)\n\t\toutput, err := exec.Command(\"eksctl\", \"delete\", \"cluster\", \"--config-file=\"+clusterConfigFile).Output()\n\t\tlog.Infoln(\"Please go to aws console to check CloudFormation status and double make sure your cluster has been shutdown.\")\n\t\tif err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"could not call 'eksctl delete cluster --config-file=%s': %v\", clusterConfigFile, string(output)),\n\t\t\t}\n\t\t}\n\t\tlog.Infoln(string(output))\n\t}\n\n\treturn nil\n}\n\n// isEksctlVersionLessThan compare two version and return true if v1 is less than v2\nfunc isEksctlVersionLessThan(v1, v2 string) (bool, error) {\n\tversion1, err := versionChecker.NewVersion(v1)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tversion2, err := versionChecker.NewVersion(v2)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tif version1.LessThan(version2) {\n\t\treturn true, nil\n\t}\n\n\treturn false, nil\n}\n"
  },
  {
    "path": "pkg/kfapp/aws/eks_test.go",
    "content": "package aws\n\nimport (\n\t\"github.com/golangplus/testing/assert\"\n\t\"testing\"\n)\n\nfunc TestIsEksctlVersionLessThan(t *testing.T) {\n\tv1 := \"0.1.30\"\n\tresult, _ := isEksctlVersionLessThan(v1, MINIMUM_EKSCTL_VERSION)\n\tassert.True(t, \"eksctl version\", result)\n\n\tv1 = \"0.1.32\"\n\tresult, _ = isEksctlVersionLessThan(v1, MINIMUM_EKSCTL_VERSION)\n\tassert.False(t, \"eksctl version\", result)\n\n\tv1 = \"0.1.33\"\n\tresult, _ = isEksctlVersionLessThan(v1, MINIMUM_EKSCTL_VERSION)\n\tassert.False(t, \"eksctl version\", result)\n}\n"
  },
  {
    "path": "pkg/kfapp/aws/identity.go",
    "content": "package aws\n\nimport (\n\t\"crypto/sha1\"\n\t\"crypto/tls\"\n\tjson \"encoding/json\"\n\t\"fmt\"\n\tawssdk \"github.com/aws/aws-sdk-go/aws\"\n\t\"github.com/aws/aws-sdk-go/aws/awserr\"\n\t\"github.com/aws/aws-sdk-go/service/iam\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/tidwall/gjson\"\n\tv1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\tclientset \"k8s.io/client-go/kubernetes\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n)\n\nconst (\n\tAWS_DEFAULT_AUDIENCE               = \"sts.amazonaws.com\"\n\tAWS_TRUST_IDENTITY_SUBJECT         = \"system:serviceaccount:%s:%s\"\n\tAWS_SERVICE_ACCOUNT_ANNOTATION_KEY = \"eks.amazonaws.com/role-arn\"\n\tAWS_IAM_ROLE_TAG_KEY               = \"kubeflow/cluster-name\"\n\tAWS_IAM_ROLE_ARN                   = \"arn:aws:iam::%s:role/%s\"\n)\n\n// checkIdentityProviderExists will return true when the iam identity provider exists, it may return errors\n// if it was unable to call IAM API\nfunc (aws *Aws) checkIdentityProviderExists(accountId, issuerURLWithoutProtocol string) (bool, string, error) {\n\tinput := &iam.GetOpenIDConnectProviderInput{\n\t\tOpenIDConnectProviderArn: awssdk.String(\n\t\t\tfmt.Sprintf(\"arn:aws:iam::%s:oidc-provider/%s\", accountId, issuerURLWithoutProtocol),\n\t\t),\n\t}\n\t_, err := aws.iamClient.GetOpenIDConnectProvider(input)\n\tif err != nil {\n\t\tawsError := err.(awserr.Error)\n\t\tif awsError.Code() == iam.ErrCodeNoSuchEntityException {\n\t\t\treturn false, \"\", nil\n\t\t}\n\t\treturn false, \"\", err\n\t}\n\n\treturn true, awssdk.StringValue(input.OpenIDConnectProviderArn), nil\n}\n\n// createIdentityProvider create an OpenIDConnectProvider, it's one to one mapping to EKS cluster.\nfunc (aws *Aws) createIdentityProvider(issuerUrl string) (string, error) {\n\tissuerCAThumbprint, err := getIssueCAThumbprint(issuerUrl)\n\n\toidcProviderInput := &iam.CreateOpenIDConnectProviderInput{\n\t\tClientIDList:   []*string{awssdk.String(AWS_DEFAULT_AUDIENCE)},\n\t\tThumbprintList: []*string{awssdk.String(issuerCAThumbprint)},\n\t\tUrl:            awssdk.String(issuerUrl),\n\t}\n\n\toutput, err := aws.iamClient.CreateOpenIDConnectProvider(oidcProviderInput)\n\tif err != nil {\n\t\treturn \"\", errors.Wrap(err, \"creating OIDC identity provider\")\n\t}\n\n\tlog.Infof(\"Creating OpenIDConnectProvider %v\", *output.OpenIDConnectProviderArn)\n\treturn awssdk.StringValue(output.OpenIDConnectProviderArn), nil\n}\n\n// DeleteIdentityProvider will delete the identity provider, it may return an error the API call fails\nfunc (aws *Aws) DeleteIdentityProvider(providerArn string) error {\n\tinput := &iam.DeleteOpenIDConnectProviderInput{\n\t\tOpenIDConnectProviderArn: awssdk.String(providerArn),\n\t}\n\tif _, err := aws.iamClient.DeleteOpenIDConnectProvider(input); err != nil {\n\t\treturn errors.Wrap(err, \"deleting oidc provider\")\n\t}\n\treturn nil\n}\n\n// createOrUpdateWebIdentityRole creates an IAM role with trusted entity Web Identity if role doesn't exist\nfunc (aws *Aws) createOrUpdateWebIdentityRole(oidcProviderArn, issuerUrl, roleName, serviceAccountNamespace, serviceAccountName string) error {\n\tinput := &iam.GetRoleInput{\n\t\tRoleName: awssdk.String(roleName),\n\t}\n\n\t// Don't need to update role, return immediately.\n\tif _, err := aws.iamClient.GetRole(input); err != nil {\n\t\t// check non exist or other failures.\n\t\tif aerr, ok := err.(awserr.Error); ok {\n\t\t\tswitch aerr.Code() {\n\t\t\tcase iam.ErrCodeNoSuchEntityException:\n\t\t\t\tlog.Infof(\"Role %v doesn't exist, creating for KSA %s/%s\", roleName, serviceAccountNamespace, serviceAccountName)\n\t\t\tdefault:\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tlog.Infof(\"Role %v exists, skip creating role\", roleName)\n\t\treturn nil\n\t}\n\n\t// Create role\n\tstatement := MakeAssumeRoleWithWebIdentityPolicyDocument(oidcProviderArn, MapOfInterfaces{\n\t\t\"StringEquals\": map[string][]string{\n\t\t\tissuerUrl + \":aud\": []string{AWS_DEFAULT_AUDIENCE},\n\t\t\tissuerUrl + \":sub\": []string{fmt.Sprintf(AWS_TRUST_IDENTITY_SUBJECT, serviceAccountNamespace, serviceAccountName)},\n\t\t},\n\t})\n\n\tassumeRolePolicyDocument := MakePolicyDocument(statement)\n\tdocument, err := json.Marshal(assumeRolePolicyDocument)\n\tif err != nil {\n\t\treturn errors.Errorf(\"%v can not be marshal to bytes\", document)\n\t}\n\n\troleInput := &iam.CreateRoleInput{\n\t\tRoleName:                 awssdk.String(roleName),\n\t\tAssumeRolePolicyDocument: awssdk.String(string(document)),\n\t\tTags: []*iam.Tag{\n\t\t\t{\n\t\t\t\tKey: awssdk.String(AWS_IAM_ROLE_TAG_KEY),\n\t\t\t\t// roleName is like kf-admin-clusterName\n\t\t\t\tValue: awssdk.String(roleName[strings.LastIndex(\"roleName\", \"-\")+1:]),\n\t\t\t},\n\t\t},\n\t}\n\n\t_, err = aws.iamClient.CreateRole(roleInput)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// createOrUpdateK8sServiceAccount creates or updates k8s service account with annotation\nfunc (aws *Aws) createOrUpdateK8sServiceAccount(k8sClientset *clientset.Clientset, serviceAccountNamespace, serviceAccountName, iamRoleArn string) error {\n\texistingSA, err := k8sClientset.CoreV1().ServiceAccounts(serviceAccountNamespace).Get(serviceAccountName, metav1.GetOptions{})\n\tif err == nil {\n\t\tlog.Infof(\"Service account %v already exists\", serviceAccountName)\n\t\tif existingSA.Annotations == nil {\n\t\t\texistingSA.Annotations = map[string]string{}\n\t\t}\n\n\t\texistingSA.Annotations[AWS_SERVICE_ACCOUNT_ANNOTATION_KEY] = iamRoleArn\n\t\t_, err = k8sClientset.CoreV1().ServiceAccounts(serviceAccountNamespace).Update(existingSA)\n\t\tif err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: err.Error(),\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tlog.Infof(\"Can not find existing service account, creating %s/%s\", serviceAccountNamespace, serviceAccountName)\n\t_, err = k8sClientset.CoreV1().ServiceAccounts(serviceAccountNamespace).Create(\n\t\t&v1.ServiceAccount{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName:      serviceAccountName,\n\t\t\t\tNamespace: serviceAccountNamespace,\n\t\t\t\tAnnotations: map[string]string{\n\t\t\t\t\tAWS_SERVICE_ACCOUNT_ANNOTATION_KEY: iamRoleArn,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\n// updateRoleTrustIdentity add namespace/serviceAccount to IAM Role trust entity\nfunc (aws *Aws) updateRoleTrustIdentity(roleName, serviceAccountNamespace, serviceAccountName string) error {\n\troleInput := &iam.GetRoleInput{\n\t\tRoleName: awssdk.String(roleName),\n\t}\n\n\toutput, err := aws.iamClient.GetRole(roleInput)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Seems AssumeRolePolicyDocument is URL encoded, decode string to get string policy document\n\tdecodeValue, err := url.QueryUnescape(awssdk.StringValue(output.Role.AssumeRolePolicyDocument))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tupdatedRolePolicy, err := getUpdatedAssumeRolePolicy(decodeValue, serviceAccountNamespace, serviceAccountName)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tinput := &iam.UpdateAssumeRolePolicyInput{\n\t\tRoleName:       awssdk.String(roleName),\n\t\tPolicyDocument: awssdk.String(updatedRolePolicy),\n\t}\n\tif _, err = aws.iamClient.UpdateAssumeRolePolicy(input); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// getUpdatedAssumeRolePolicy creates a new policy document with a new ns/sa record\nfunc getUpdatedAssumeRolePolicy(policyDocument, serviceAccountNamespace, serviceAccountName string) (string, error) {\n\tvar oldDoc MapOfInterfaces\n\tjson.Unmarshal([]byte(policyDocument), &oldDoc)\n\tvar statements []MapOfInterfaces\n\tstatementInBytes, err := json.Marshal(oldDoc[\"Statement\"])\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tjson.Unmarshal(statementInBytes, &statements)\n\n\toidcRoleArn := gjson.Get(policyDocument, \"Statement.0.Principal.Federated\").String()\n\tissuerUrlWithProtocol := getIssuerUrlFromRoleArn(oidcRoleArn)\n\n\tkey := fmt.Sprintf(\"%s:sub\", issuerUrlWithProtocol)\n\ttrustIdentity := fmt.Sprintf(AWS_TRUST_IDENTITY_SUBJECT, serviceAccountNamespace, serviceAccountName)\n\n\t// We assume we only operator on first statement, don't add/remove new statement\n\tstatement := statements[0]\n\tstatementInBytes, err = json.Marshal(statement)\n\tidentities := gjson.Get(string(statementInBytes), \"Condition.StringEquals\").Map()\n\n\tvar originalIdentities []string\n\tval, ok := identities[key]\n\tif ok {\n\t\tfor _, identity := range val.Array() {\n\t\t\t// avoid adding duplicate record\n\t\t\tif identity.Str == trustIdentity {\n\t\t\t\treturn policyDocument, nil\n\t\t\t}\n\t\t\toriginalIdentities = append(originalIdentities, identity.Str)\n\t\t}\n\t}\n\toriginalIdentities = append(originalIdentities, trustIdentity)\n\n\tdocument := MakeAssumeRoleWithWebIdentityPolicyDocument(oidcRoleArn, MapOfInterfaces{\n\t\t\"StringEquals\": map[string][]string{\n\t\t\tissuerUrlWithProtocol + \":aud\": []string{AWS_DEFAULT_AUDIENCE},\n\t\t\tissuerUrlWithProtocol + \":sub\": originalIdentities,\n\t\t},\n\t})\n\tnewAssumeRolePolicyDocument := MakePolicyDocument(document)\n\tnewPolicyDoc, err := json.Marshal(newAssumeRolePolicyDocument)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(newPolicyDoc), nil\n}\n\n// getIssueCAThumbprint will generate CAThumbprint from a given issuerURL, this is used to create an oidc provider\nfunc getIssueCAThumbprint(issuerURL string) (string, error) {\n\tvar issuerCAThumbprint string\n\n\tclient := &http.Client{\n\t\tTransport: &http.Transport{\n\t\t\tTLSClientConfig: &tls.Config{\n\t\t\t\tInsecureSkipVerify: true,\n\t\t\t},\n\t\t\tProxy: http.ProxyFromEnvironment,\n\t\t},\n\t}\n\n\tresponse, err := client.Get(issuerURL)\n\tif err != nil {\n\t\treturn \"\", errors.Wrap(err, \"connecting to issuer OIDC\")\n\t}\n\n\tif response.TLS != nil {\n\t\tif numCerts := len(response.TLS.PeerCertificates); numCerts >= 1 {\n\t\t\troot := response.TLS.PeerCertificates[numCerts-1]\n\t\t\tissuerCAThumbprint = fmt.Sprintf(\"%x\", sha1.Sum(root.Raw))\n\t\t\treturn issuerCAThumbprint, nil\n\t\t}\n\t}\n\treturn \"\", errors.Errorf(\"unable to get OIDC issuer's certificate\")\n}\n\n// deleteIAMRole delete an IAM role\nfunc (aws *Aws) deleteIAMRole(roleName string) error {\n\tinput := &iam.DeleteRoleInput{\n\t\tRoleName: awssdk.String(roleName),\n\t}\n\n\tif _, err := aws.iamClient.DeleteRole(input); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// getIAMRoleNameFromIAMRoleArn converts roleArn to roleName\nfunc getIAMRoleNameFromIAMRoleArn(arn string) string {\n\treturn arn[strings.LastIndex(arn, \"/\")+1:]\n}\n\n// getIssuerUrlFromRoleArn parse issuerUrl from Arn: arn:aws:iam::${accountId}:oidc-provider/${issuerUrl}\nfunc getIssuerUrlFromRoleArn(arn string) string {\n\treturn arn[strings.Index(arn, \"/\")+1:]\n}\n\n// MakeAssumeRoleWithWebIdentityPolicyDocument constructs a trust policy statement for given web identity provider with given conditions\nfunc MakeAssumeRoleWithWebIdentityPolicyDocument(providerARN string, condition MapOfInterfaces) MapOfInterfaces {\n\treturn MapOfInterfaces{\n\t\t\"Effect\": \"Allow\",\n\t\t\"Action\": \"sts:AssumeRoleWithWebIdentity\",\n\t\t\"Principal\": map[string]string{\n\t\t\t\"Federated\": providerARN,\n\t\t},\n\t\t\"Condition\": condition,\n\t}\n}\n\n// MakePolicyDocument constructs a policy document with given statements\nfunc MakePolicyDocument(statements ...MapOfInterfaces) MapOfInterfaces {\n\treturn MapOfInterfaces{\n\t\t\"Version\":   \"2012-10-17\",\n\t\t\"Statement\": statements,\n\t}\n}\n\ntype (\n\t// MapOfInterfaces is an alias for map[string]interface{}\n\tMapOfInterfaces = map[string]interface{}\n)\n"
  },
  {
    "path": "pkg/kfapp/aws/k8sClient.go",
    "content": "package aws\n\nimport (\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\tv1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\tclientset \"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/tools/clientcmd\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// getK8sclient creates a Kubernetes client set\nfunc getK8sclient() (*clientset.Clientset, error) {\n\tkubeconfig := os.Getenv(\"KUBECONFIG\")\n\n\tif kubeconfig == \"\" {\n\t\tif home := homeDir(); home != \"\" {\n\t\t\tkubeconfig = filepath.Join(home, \".kube\", \"config\")\n\t\t}\n\t}\n\n\t// use the current context in kubeconfig\n\tconfig, err := clientcmd.BuildConfigFromFlags(\"\", kubeconfig)\n\tif err != nil {\n\t\treturn nil, errors.Errorf(\"Failed to create config file from %s\", kubeconfig)\n\t}\n\n\tclientset, err := clientset.NewForConfig(config)\n\tif err != nil {\n\t\treturn nil, errors.Errorf(\"Failed to create kubernetes clientset\")\n\t}\n\n\treturn clientset, nil\n}\n\n// homeDir returns home folder and it's used to detect kubeconfig file\nfunc homeDir() string {\n\tif h := os.Getenv(\"HOME\"); h != \"\" {\n\t\treturn h\n\t}\n\treturn os.Getenv(\"USERPROFILE\") // windows\n}\n\nfunc createNamespace(client *clientset.Clientset, namespace string) error {\n\t_, err := client.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{})\n\tif err == nil {\n\t\tlog.Infof(\"Namespace %v already exists...\", namespace)\n\t\treturn nil\n\t}\n\tlog.Infof(\"Creating namespace: %v\", namespace)\n\t_, err = client.CoreV1().Namespaces().Create(\n\t\t&v1.Namespace{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName: namespace,\n\t\t\t},\n\t\t},\n\t)\n\n\treturn err\n}\n\nfunc deleteNamespace(client *clientset.Clientset, namespace string) error {\n\t_, err := client.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{})\n\tif err != nil {\n\t\tlog.Infof(\"Namespace %v does not exist, skip deleting\", namespace)\n\t\treturn nil\n\t}\n\tlog.Infof(\"Deleting namespace: %v\", namespace)\n\tbackground := metav1.DeletePropagationBackground\n\terr = client.CoreV1().Namespaces().Delete(\n\t\tnamespace, &metav1.DeleteOptions{\n\t\t\tPropagationPolicy: &background,\n\t\t},\n\t)\n\n\treturn err\n}\n\nfunc createSecret(client *clientset.Clientset, secretName string, namespace string, data map[string][]byte) error {\n\tsecret := &v1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      secretName,\n\t\t\tNamespace: namespace,\n\t\t},\n\t\tData: data,\n\t}\n\tlog.Infof(\"Creating secret: %v/%v\", namespace, secretName)\n\t_, err := client.CoreV1().Secrets(namespace).Create(secret)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/kfapp/coordinator/coordinator.go",
    "content": "/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage coordinator\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tkfdefsv1alpha1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n\tkfdefsv1beta1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1beta1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/aws\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/existing_arrikto\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/gcp\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/kustomize\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/minikube\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tkfconfigloaders \"github.com/kubeflow/kfctl/v3/pkg/kfconfig/loaders\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\n// Builder defines the methods used to create KfApps.\n// Primary purpose is to allow injecting a fake for use in testing.\ntype Builder interface {\n\tLoadKfAppCfgFile(cfgFile string) (kftypesv3.KfApp, error)\n}\n\ntype DefaultBuilder struct {\n}\n\nfunc (b *DefaultBuilder) LoadKfAppCfgFile(cfgFile string) (kftypesv3.KfApp, error) {\n\treturn NewLoadKfAppFromURI(cfgFile)\n}\n\n// GetPlatform will return an implementation of kftypesv3.GetPlatform that matches the platform string\n// It looks for statically compiled-in implementations, otherwise throws unrecognized error\nfunc getPlatform(kfdef *kfconfig.KfConfig) (kftypesv3.Platform, error) {\n\tswitch kfdef.Spec.Platform {\n\tcase string(kftypesv3.MINIKUBE):\n\t\treturn minikube.Getplatform(kfdef), nil\n\tcase string(kftypesv3.GCP):\n\t\treturn gcp.GetPlatform(kfdef)\n\tcase string(kftypesv3.EXISTING_ARRIKTO):\n\t\treturn existing_arrikto.GetPlatform(kfdef)\n\tcase string(kftypesv3.AWS):\n\t\treturn aws.GetPlatform(kfdef)\n\tdefault:\n\t\t// TODO(https://github.com/kubeflow/kubeflow/issues/3520) Fix dynamic loading\n\t\t// of platform plugins.\n\t\tlog.Infof(\"** Unrecognized platform %v **\", kfdef.Spec.Platform)\n\t\treturn nil, fmt.Errorf(\"Unrecognized platform %v\", kfdef.Spec.Platform)\n\t}\n}\n\nfunc (coord *coordinator) getPackageManagers(kfdef *kfconfig.KfConfig) *map[string]kftypesv3.KfApp {\n\tvar packagemanagers = make(map[string]kftypesv3.KfApp)\n\t_packagemanager, _packagemanagerErr := getPackageManager(kfdef)\n\tif _packagemanagerErr != nil {\n\t\tlog.Fatalf(\"Could not get packagemanager %v: %v **\", kftypesv3.KUSTOMIZE, _packagemanagerErr)\n\t}\n\tif _packagemanager != nil {\n\t\tpackagemanagers[kftypesv3.KUSTOMIZE] = _packagemanager\n\t}\n\treturn &packagemanagers\n}\n\n// getPackageManager will return an implementation of kftypesv3.KfApp that matches the packagemanager string\n// It looks for statically compiled-in implementations, otherwise it delegates to\n// kftypesv3.LoadKfApp which will try and dynamically load a .so\n//\nfunc getPackageManager(kfdef *kfconfig.KfConfig) (kftypesv3.KfApp, error) {\n\treturn kustomize.GetKfApp(kfdef), nil\n}\n\n// Helper function to filter out spartakus.\nfunc filterSpartakus(components []string) []string {\n\tret := []string{}\n\tfor _, comp := range components {\n\t\tif comp != \"spartakus\" {\n\t\t\tret = append(ret, comp)\n\t\t}\n\t}\n\treturn ret\n}\n\n// Helper function to print out warning message if using usage reporting.\nfunc usageReportWarn(applications []kfconfig.Application) {\n\tmsg := \"\\n\" +\n\t\t\"****************************************************************\\n\" +\n\t\t\"Notice anonymous usage reporting enabled using spartakus\\n\" +\n\t\t\"To disable it\\n\" +\n\t\t\"If you have already deployed it run the following commands:\\n\" +\n\t\t\"  cd $(pwd)\\n\" +\n\t\t\"  kubectl -n ${K8S_NAMESPACE} delete deploy -l app=spartakus\\n\" +\n\t\t\"\\n\" +\n\t\t\"For more info: https://www.kubeflow.org/docs/other-guides/usage-reporting/\\n\" +\n\t\t\"****************************************************************\\n\" +\n\t\t\"\\n\"\n\tfor _, app := range applications {\n\t\tif app.Name == \"spartakus\" {\n\t\t\tlog.Infof(msg)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// repoVersionToRepoStruct converts the name of a repo and the old style version\n// into a new go-getter style syntax and a Repo spec\n//\n//   master\n//\t tag\n//\t pull/<ID>[/head]\n//\nfunc repoVersionToUri(repo string, version string) string {\n\t// Version can be\n\t// --version master\n\t// --version tag\n\t// --version pull/<ID>/head\n\tif strings.HasPrefix(version, \"pull\") {\n\t\tif !strings.HasSuffix(version, \"head\") {\n\t\t\tversion = version + \"/head\"\n\t\t}\n\t}\n\ttarballUrl := \"https://github.com/kubeflow/\" + repo + \"/tarball/\" + version + \"?archive=tar.gz\"\n\n\treturn tarballUrl\n}\n\n// isDirEmpty - quick check to determine if the  directory is empty\nfunc isDirEmpty(dir string) bool {\n\tfiles, _ := ioutil.ReadDir(dir)\n\tif len(files) > 1 {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// This is the entrypoint for commands like build or apply.\n// NewLoadKfAppFromURI takes in a config file and constructs the KfApp\n// used by the build and apply semantics for kfctl\nfunc NewLoadKfAppFromURI(configFile string) (kftypesv3.KfApp, error) {\n\tkfdef, err := kfconfigloaders.LoadConfigFromURI(configFile)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error creating KfApp from config file: %v\", err),\n\t\t}\n\t}\n\n\tisRemoteFile, err := utils.IsRemoteFile(configFile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// If the config file is a remote URI, check to see if the AppDir\n\t// is empty because we will be generating the KfApp there.\n\tif isRemoteFile {\n\t\t// AppDir should be the cwd.\n\t\tif !isDirEmpty(kfdef.Spec.AppDir) {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"current directory %v not empty, please switch directories\", kfdef.Spec.AppDir),\n\t\t\t}\n\t\t}\n\t\t_, err = CreateKfAppCfgFile(kfdef)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Error creating KfApp from config file: %v\", err),\n\t\t\t}\n\t\t}\n\t}\n\n\tappFile := filepath.Join(kfdef.Spec.AppDir, kfdef.Spec.ConfigFileName)\n\t// Since we know we have a local file we can set a default name if none is set based on the local directory\n\tif kfdef.Name == \"\" {\n\t\tkfdef.Name = nameFromAppFile(filepath.Join(kfdef.Spec.AppDir, kfdef.Spec.ConfigFileName))\n\t\tif kfdef.Name == \"\" {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"KfDef.Name isn't set and there was a problem inferring the name based on the path %v\\nPlease set the name explicitly in the KFDef spec.\", appFile),\n\t\t\t}\n\t\t}\n\t\tlog.Infof(\"No name specified in KfDef.Metadata.Name; defaulting to %v based on location of config file: %v.\", kfdef.Name, appFile)\n\t}\n\n\tc := &coordinator{\n\t\tPlatforms:       make(map[string]kftypesv3.Platform),\n\t\tPackageManagers: make(map[string]kftypesv3.KfApp),\n\t\tKfDef:           kfdef,\n\t}\n\n\t// fetch the platform [gcp,minikube]\n\tplatform := c.KfDef.Spec.Platform\n\tif platform != \"\" {\n\t\t_platform, _platformErr := getPlatform(c.KfDef)\n\t\tif _platformErr != nil {\n\t\t\tlog.Fatalf(\"Could not get platform %v: %v **\", platform, _platformErr)\n\t\t\treturn nil, _platformErr\n\t\t}\n\t\tif _platform != nil {\n\t\t\tc.Platforms[platform] = _platform\n\t\t}\n\t}\n\tpkg, pkgErr := getPackageManager(c.KfDef)\n\tif pkgErr != nil {\n\t\tlog.Fatalf(\"Could not get package manager %v: %v **\", kftypesv3.KUSTOMIZE, pkgErr)\n\t\treturn nil, pkgErr\n\t}\n\tif pkg != nil {\n\t\tc.PackageManagers[kftypesv3.KUSTOMIZE] = pkg\n\t}\n\n\tinitErr := c.Init(kftypesv3.ALL)\n\tif initErr != nil {\n\t\treturn nil, fmt.Errorf(\"KfApp initiliazation failed: %v\", initErr)\n\t}\n\tgenerateErr := c.Generate(kftypesv3.ALL)\n\tif generateErr != nil {\n\t\treturn nil, fmt.Errorf(\"couldn't generate KfApp: %v\", generateErr)\n\t}\n\n\treturn c, nil\n}\n\n// TODO: remove this\n// This is for kfctlServer. We can remove this after kfctlServer uses kfconfig\nfunc CreateKfAppCfgFileWithKfDef(d *kfdefsv1alpha1.KfDef) (string, error) {\n\talphaConverter := kfconfigloaders.V1alpha1{}\n\tkfconfig, err := alphaConverter.LoadKfConfig(*d)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tkfconfig.Spec.ConfigFileName = kftypesv3.KfConfigFile\n\treturn CreateKfAppCfgFile(kfconfig)\n}\n\n// CreateKfAppCfgFile will create the application directory and persist\n// the KfDef to it as app.yaml.\n// This is only used when the config file is remote (https://github...)\n// Returns an error if the app.yaml file already exists\n// Returns path to the app.yaml file.\nfunc CreateKfAppCfgFile(d *kfconfig.KfConfig) (string, error) {\n\tif _, err := os.Stat(d.Spec.AppDir); os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating directory %v\", d.Spec.AppDir)\n\t\tappdirErr := os.MkdirAll(d.Spec.AppDir, os.ModePerm)\n\t\tif appdirErr != nil {\n\t\t\tlog.Errorf(\"Couldn't create directory %v: %v\", d.Spec.AppDir, appdirErr)\n\t\t\treturn \"\", appdirErr\n\t\t}\n\t} else {\n\t\tlog.Infof(\"App directory %v already exists\", d.Spec.AppDir)\n\t}\n\n\tlog.Infof(\"Writing KfDef to %v\", d.Spec.ConfigFileName)\n\tcfgFilePathErr := kfconfigloaders.WriteConfigToFile(*d)\n\tif cfgFilePathErr != nil {\n\t\tlog.Errorf(\"Failed to write config: %v\", cfgFilePathErr)\n\t}\n\treturn filepath.Join(d.Spec.AppDir, d.Spec.ConfigFileName), cfgFilePathErr\n}\n\n// nameFromAppFile infers a default name given the path to the KFDef file.\n// returns the empty string if there is a problem getting the name.\nfunc nameFromAppFile(appFile string) string {\n\tabsAppPath, err := filepath.Abs(appFile)\n\n\tif err != nil {\n\t\tlog.Errorf(\"KfDef.Name isn't set and there was a problem inferring the name based on the path %v; error: %v\\nPlease set the name explicitly in the KFDef spec.\", appFile, err)\n\t\treturn \"\"\n\t}\n\n\tappDir := filepath.Dir(absAppPath)\n\n\tname := filepath.Base(appDir)\n\n\tif name == appDir {\n\t\t// This case happens if appFile is in the root directory\n\t\treturn \"\"\n\t}\n\n\treturn name\n}\n\n// this type holds platform implementations of KfApp\n// eg Platforms[kftypesv3.GCP], Platforms[kftypes.MINIKUBE], PackageManagers[\"kustomize\"]\n// The data attributes in kfconfig.KfConfig are used by different KfApp implementations\ntype coordinator struct {\n\tPlatforms       map[string]kftypesv3.Platform\n\tPackageManagers map[string]kftypesv3.KfApp\n\tKfDef           *kfconfig.KfConfig\n}\n\n// Return a copy of kfdef v1beta1\ntype KfDefGetterV1beta1 interface {\n\tGetKfDefV1Beta1() *kfdefsv1beta1.KfDef\n}\n\n// Get reference to the plugin .\ntype PluginGetter interface {\n\tGetPlugin(name string) (kftypesv3.KfApp, bool)\n}\n\n//TODO(kunming): remove after kfctlserver change (https://github.com/kubeflow/kubeflow/pull/4399) merged.\nfunc (kfapp *coordinator) GetKfDef() *kfdefsv1beta1.KfDef {\n\treturn nil\n}\n\n// GetKfDefV1Beta1 returns a copy of KfDef V1Beta1 used by this application.\nfunc (kfapp *coordinator) GetKfDefV1Beta1() *kfdefsv1beta1.KfDef {\n\tkfdefIns := &kfdefsv1beta1.KfDef{}\n\terr := kfconfigloaders.V1beta1{}.LoadKfDef(*(kfapp.KfDef.DeepCopy()), kfdefIns)\n\tif err != nil {\n\t\tkfdefIns.Status.Conditions = append(kfdefIns.Status.Conditions, kfdefsv1beta1.KfDefCondition{\n\t\t\tType:    kfdefsv1beta1.KfDegraded,\n\t\t\tMessage: err.Error(),\n\t\t})\n\t\treturn kfdefIns\n\t}\n\n\treturn kfdefIns\n}\n\n// GetPlatform returns the specified platform.\nfunc (kfapp *coordinator) GetPlugin(name string) (kftypesv3.KfApp, bool) {\n\n\tif r, ok := kfapp.Platforms[name]; ok {\n\t\treturn r, ok\n\t}\n\n\tr, ok := kfapp.PackageManagers[name]\n\treturn r, ok\n}\n\nfunc (kfapp *coordinator) Dump(resources kftypesv3.ResourceEnum) error {\n\tfor packageManagerName, packageManager := range kfapp.PackageManagers {\n\t\terr := packageManager.Dump(kftypesv3.K8S)\n\t\tif err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"kfApp Apply failed for %v: %v\",\n\t\t\t\t\tpackageManagerName, err),\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (kfapp *coordinator) Apply(resources kftypesv3.ResourceEnum) error {\n\tplatform := func() error {\n\t\tif kfapp.KfDef.Spec.Platform != \"\" {\n\t\t\tplatform := kfapp.Platforms[kfapp.KfDef.Spec.Platform]\n\t\t\tif platform != nil {\n\t\t\t\tplatformErr := platform.Apply(resources)\n\t\t\t\tif platformErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"coordinator Apply failed for %v: %v\",\n\t\t\t\t\t\t\tkfapp.KfDef.Spec.Platform, platformErr),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"%v not in Platforms\",\n\t\t\t\t\t\tkfapp.KfDef.Spec.Platform),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tk8s := func() error {\n\t\tfor packageManagerName, packageManager := range kfapp.PackageManagers {\n\t\t\tpackageManagerErr := packageManager.Apply(kftypesv3.K8S)\n\t\t\tif packageManagerErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"kfApp Apply failed for %v: %v\",\n\t\t\t\t\t\tpackageManagerName, packageManagerErr),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tupdateConfigErr := kfconfigloaders.WriteConfigToFile(*kfapp.KfDef)\n\t\tif updateConfigErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: updateConfigErr.(*kfapis.KfError).Code,\n\t\t\t\tMessage: fmt.Sprintf(\"cannot update config file %v: %v\", kftypesv3.KfConfigFile,\n\t\t\t\t\tupdateConfigErr.(*kfapis.KfError).Message),\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tgcpAddedConfig := func() error {\n\t\tif kfapp.KfDef.Spec.Email == \"\" || kfapp.KfDef.Spec.Platform != kftypesv3.GCP {\n\t\t\treturn nil\n\t\t}\n\n\t\tif p, ok := kfapp.Platforms[kfapp.KfDef.Spec.Platform]; !ok {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: \"Platform GCP specified but not loaded.\",\n\t\t\t}\n\t\t} else {\n\t\t\tgcp := p.(*gcp.Gcp)\n\t\t\tif err := gcp.SetupWorkloadIdentityPermission(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// Keep podDefault for backward compatibility\n\t\t\treturn gcp.ConfigPodDefault()\n\t\t}\n\t}\n\n\tif err := kfapp.KfDef.SyncCache(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not sync cache. Error: %v\", err),\n\t\t}\n\t}\n\n\tswitch resources {\n\tcase kftypesv3.ALL:\n\t\tif err := platform(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := k8s(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn gcpAddedConfig()\n\tcase kftypesv3.PLATFORM:\n\t\treturn platform()\n\tcase kftypesv3.K8S:\n\t\tif err := k8s(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// TODO(gabrielwen): Need to find a more proper way of injecting plugings.\n\t\t// https://github.com/kubeflow/kubeflow/issues/3708\n\t\treturn gcpAddedConfig()\n\t}\n\treturn nil\n}\n\nfunc (kfapp *coordinator) Delete(resources kftypesv3.ResourceEnum) error {\n\tplatform := func() error {\n\t\tif kfapp.KfDef.Spec.Platform != \"\" {\n\t\t\tplatform := kfapp.Platforms[kfapp.KfDef.Spec.Platform]\n\t\t\tif platform != nil {\n\t\t\t\tplatformErr := platform.Delete(resources)\n\t\t\t\tif platformErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"coordinator Delete failed for %v: %v\",\n\t\t\t\t\t\t\tkfapp.KfDef.Spec.Platform, platformErr),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"%v not in Platforms\",\n\t\t\t\t\t\tkfapp.KfDef.Spec.Platform),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tk8s := func() error {\n\t\tfor packageManagerName, packageManager := range kfapp.PackageManagers {\n\t\t\tpackageManagerErr := packageManager.Delete(kftypesv3.K8S)\n\t\t\tif packageManagerErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"kfApp Delete failed for %v: %v\",\n\t\t\t\t\t\tpackageManagerName, packageManagerErr),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tif err := kfapp.KfDef.SyncCache(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not sync cache. Error: %v\", err),\n\t\t}\n\t}\n\n\tswitch resources {\n\tcase kftypesv3.ALL:\n\t\t// if we're deleting ALL, any problems with deleting k8s will abort and not delete the platform\n\t\tif err := k8s(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := platform(); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase kftypesv3.PLATFORM:\n\t\t// deleting the PLATFORM means deleting the cluster. We remove k8s first in order free up any cloud vendor\n\t\t// resources. Deleting k8 resources is a best effort and partial delete or failure should not\n\t\t// prevent PLATFORM (cluster) deletion\n\t\t_ = k8s()\n\t\tif err := platform(); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase kftypesv3.K8S:\n\t\tif err := k8s(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (kfapp *coordinator) Generate(resources kftypesv3.ResourceEnum) error {\n\tplatform := func() error {\n\t\tif kfapp.KfDef.Spec.Platform != \"\" {\n\t\t\tplatform := kfapp.Platforms[kfapp.KfDef.Spec.Platform]\n\t\t\tif platform != nil {\n\t\t\t\tplatformErr := platform.Generate(resources)\n\t\t\t\tif platformErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"coordinator Generate failed for %v: %v\",\n\t\t\t\t\t\t\tkfapp.KfDef.Spec.Platform, platformErr),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcreateConfigErr := kfconfigloaders.WriteConfigToFile(*kfapp.KfDef)\n\t\t\t\tif createConfigErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: createConfigErr.(*kfapis.KfError).Code,\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"cannot create config file %v: %v\", kftypesv3.KfConfigFile,\n\t\t\t\t\t\t\tcreateConfigErr.(*kfapis.KfError).Message),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"%v not in Platforms\",\n\t\t\t\t\t\tkfapp.KfDef.Spec.Platform),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tk8s := func() error {\n\t\tfor packageManagerName, packageManager := range kfapp.PackageManagers {\n\t\t\tpackageManagerErr := packageManager.Generate(kftypesv3.K8S)\n\t\t\tif packageManagerErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"kfApp Generate failed for %v: %v\",\n\t\t\t\t\t\tpackageManagerName, packageManagerErr),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Print out warning message if using usage reporting component.\n\tusageReportWarn(kfapp.KfDef.Spec.Applications)\n\n\tif err := kfapp.KfDef.SyncCache(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not sync cache. Error: %v\", err),\n\t\t}\n\t}\n\n\tswitch resources {\n\tcase kftypesv3.ALL:\n\t\tif err := platform(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn k8s()\n\tcase kftypesv3.PLATFORM:\n\t\treturn platform()\n\tcase kftypesv3.K8S:\n\t\treturn k8s()\n\t}\n\treturn nil\n}\n\nfunc (kfapp *coordinator) Init(resources kftypesv3.ResourceEnum) error {\n\tplatform := func() error {\n\t\tif kfapp.KfDef.Spec.Platform != \"\" {\n\t\t\tplatform := kfapp.Platforms[kfapp.KfDef.Spec.Platform]\n\t\t\tif platform != nil {\n\t\t\t\tplatformErr := platform.Init(resources)\n\t\t\t\tif platformErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"coordinator Init failed for %v: %v\",\n\t\t\t\t\t\t\tkfapp.KfDef.Spec.Platform, platformErr),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcreateConfigErr := kfconfigloaders.WriteConfigToFile(*kfapp.KfDef)\n\t\t\t\tif createConfigErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: createConfigErr.(*kfapis.KfError).Code,\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"cannot create config file %v: %v\", kftypesv3.KfConfigFile,\n\t\t\t\t\t\t\tcreateConfigErr.(*kfapis.KfError).Message),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"%v not in Platforms\",\n\t\t\t\t\t\tkfapp.KfDef.Spec.Platform),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tk8s := func() error {\n\t\tfor packageManagerName, packageManager := range kfapp.PackageManagers {\n\t\t\tpackageManagerErr := packageManager.Init(kftypesv3.K8S)\n\t\t\tif packageManagerErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"kfApp Init failed for %v: %v\",\n\t\t\t\t\t\tpackageManagerName, packageManagerErr),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tswitch resources {\n\tcase kftypesv3.ALL:\n\t\tif err := platform(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn k8s()\n\tcase kftypesv3.PLATFORM:\n\t\treturn platform()\n\tcase kftypesv3.K8S:\n\t\treturn k8s()\n\t}\n\treturn nil\n}\n\nfunc (kfapp *coordinator) Show(resources kftypesv3.ResourceEnum) error {\n\tswitch resources {\n\tcase kftypesv3.K8S:\n\t\tfallthrough\n\tcase kftypesv3.PLATFORM:\n\t\tfallthrough\n\tcase kftypesv3.ALL:\n\t\tif kfapp.KfDef.Spec.Platform != \"\" {\n\t\t\tplatform := kfapp.Platforms[kfapp.KfDef.Spec.Platform]\n\t\t\tshow, ok := platform.(kftypesv3.KfShow)\n\t\t\tif ok && show != nil {\n\t\t\t\tshowErr := show.Show(resources)\n\t\t\t\tif showErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"coordinator Show failed for %v: %v\",\n\t\t\t\t\t\t\tkfapp.KfDef.Spec.Platform, showErr),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"coordinator Show failed for %v: Not support 'Show'\",\n\t\t\t\t\t\tkfapp.KfDef.Spec.Platform),\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"%v not in Platforms\",\n\t\t\t\t\tkfapp.KfDef.Spec.Platform),\n\t\t\t}\n\t\t}\n\t\tfor packageManagerName, packageManager := range kfapp.PackageManagers {\n\t\t\tshow, ok := packageManager.(kftypesv3.KfShow)\n\t\t\tif ok && show != nil {\n\t\t\t\tshowErr := show.Show(kftypesv3.K8S)\n\t\t\t\tif showErr != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"kfApp Show failed for %v: %v\",\n\t\t\t\t\t\t\tpackageManagerName, showErr),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfapp/coordinator/coordinator_test.go",
    "content": "package coordinator\n\nimport (\n\t\"encoding/json\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"reflect\"\n\t\"testing\"\n\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\nfunc Test_CreateKfAppCfgFile(t *testing.T) {\n\ttype testCase struct {\n\t\tInput         kfconfig.KfConfig\n\t\tDirExists     bool\n\t\tCfgFileExists bool\n\t\tExpectError   bool\n\t}\n\n\tcases := []testCase{\n\t\t// Test file is created when directory doesn't exist.\n\t\t{\n\t\t\tInput: kfconfig.KfConfig{\n\t\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\t\tAPIVersion: \"kfdef.apps.kubeflow.org/v1alpha1\",\n\t\t\t\t},\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tConfigFileName: kftypesv3.KfConfigFile,\n\t\t\t\t},\n\t\t\t},\n\t\t\tDirExists:     false,\n\t\t\tCfgFileExists: false,\n\t\t\tExpectError:   false,\n\t\t},\n\t\t// Test file is created when directory exists\n\t\t{\n\t\t\tInput: kfconfig.KfConfig{\n\t\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\t\tAPIVersion: \"kfdef.apps.kubeflow.org/v1alpha1\",\n\t\t\t\t},\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tConfigFileName: kftypesv3.KfConfigFile,\n\t\t\t\t},\n\t\t\t},\n\t\t\tDirExists:     true,\n\t\t\tCfgFileExists: false,\n\t\t\tExpectError:   false,\n\t\t},\n\t\t// Test an error is raised if the config file already exists.\n\t\t{\n\t\t\tInput: kfconfig.KfConfig{\n\t\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\t\tAPIVersion: \"kfdef.apps.kubeflow.org/v1alpha1\",\n\t\t\t\t},\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tConfigFileName: kftypesv3.KfConfigFile,\n\t\t\t\t},\n\t\t\t},\n\t\t\tDirExists:     true,\n\t\t\tCfgFileExists: true,\n\t\t\tExpectError:   false,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\n\t\ttDir, err := ioutil.TempDir(\"\", \"\")\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not create temporary directory; %v\", err)\n\t\t}\n\n\t\tif !c.DirExists {\n\t\t\terr := os.RemoveAll(tDir)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Could not delete %v; error %v\", tDir, err)\n\t\t\t}\n\t\t}\n\n\t\tif c.CfgFileExists {\n\t\t\texistingCfgFile := path.Join(tDir, kftypesv3.KfConfigFile)\n\t\t\terr := ioutil.WriteFile(existingCfgFile, []byte(\"hello world\"), 0644)\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Could not write %v; error %v\", existingCfgFile, err)\n\t\t\t}\n\t\t}\n\n\t\tc.Input.Spec.AppDir = tDir\n\t\tcfgFile, err := CreateKfAppCfgFile(&c.Input)\n\n\t\tpCase, _ := Pformat(c)\n\t\thasError := err != nil\n\t\tif hasError != c.ExpectError {\n\t\t\tt.Errorf(\"Test case %v;\\n CreateKfAppCfgFile returns error; got %v want %v\", pCase, hasError, c.ExpectError)\n\t\t}\n\n\t\texpectFile := path.Join(tDir, kftypesv3.KfConfigFile)\n\n\t\tif !c.ExpectError {\n\t\t\tif expectFile != cfgFile {\n\t\t\t\tt.Errorf(\"Test case %v;\\n CreateKfAppCfgFile returns cfgFile; got %v want %v\", pCase, cfgFile, expectFile)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc Test_repoVersionToRepoStruct(t *testing.T) {\n\ttype testCase struct {\n\t\tname     string\n\t\tversion  string\n\t\texpected string\n\t}\n\n\ttestCases := []testCase{\n\t\t{\n\t\t\tname:     \"kubeflow\",\n\t\t\tversion:  \"master\",\n\t\t\texpected: \"https://github.com/kubeflow/kubeflow/tarball/master?archive=tar.gz\",\n\t\t},\n\t\t{\n\t\t\tname:     \"manifests\",\n\t\t\tversion:  \"pull/189\",\n\t\t\texpected: \"https://github.com/kubeflow/manifests/tarball/pull/189/head?archive=tar.gz\",\n\t\t},\n\t}\n\n\tfor _, c := range testCases {\n\t\tactual := repoVersionToUri(c.name, c.version)\n\n\t\tif !reflect.DeepEqual(actual, c.expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.expected)\n\t\t\tt.Errorf(\"Error converting got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc Test_nameFromAppFile(t *testing.T) {\n\ttype testCase struct {\n\t\tappFile      string\n\t\texpectedName string\n\t}\n\n\ttestCases := []testCase{\n\t\t{\n\t\t\tappFile:      \"/mykfapp/kfctl.yaml\",\n\t\t\texpectedName: \"mykfapp\",\n\t\t},\n\t\t{\n\t\t\tappFile:      \"/parentdir/subapp/app.yaml\",\n\t\t\texpectedName: \"subapp\",\n\t\t},\n\t\t{\n\t\t\tappFile:      \"/kfctl.yaml\",\n\t\t\texpectedName: \"\",\n\t\t},\n\t}\n\n\tfor _, c := range testCases {\n\t\tactual := nameFromAppFile(c.appFile)\n\n\t\tif actual != c.expectedName {\n\t\t\tt.Errorf(\"Error getting name from %v got;\\n%v\\nwant;\\n%v\", c.appFile, actual, c.expectedName)\n\t\t}\n\t}\n}\n\n// Pformat returns a pretty format output of any value.\nfunc Pformat(value interface{}) (string, error) {\n\tif s, ok := value.(string); ok {\n\t\treturn s, nil\n\t}\n\tvalueJson, err := json.MarshalIndent(value, \"\", \"  \")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(valueJson), nil\n}\n"
  },
  {
    "path": "pkg/kfapp/coordinator/fake/fake.go",
    "content": "// package fake provides a fake implementation of the coordinator for use in tests\npackage fake\n\nimport (\n\t\"path\"\n\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tgcpFake \"github.com/kubeflow/kfctl/v3/pkg/kfapp/gcp/fake\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tkfloaders \"github.com/kubeflow/kfctl/v3/pkg/kfconfig/loaders\"\n)\n\ntype FakeCoordinator struct {\n\tKfDef   *kfconfig.KfConfig\n\tPlugins map[string]kftypes.KfApp\n}\n\nfunc (f *FakeCoordinator) Apply(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (f *FakeCoordinator) Delete(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (f *FakeCoordinator) Dump(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (f *FakeCoordinator) Generate(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (f *FakeCoordinator) Init(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (f *FakeCoordinator) GetKfDef() *kfconfig.KfConfig {\n\treturn f.KfDef\n}\n\nfunc (f *FakeCoordinator) GetPlugin(name string) (kftypes.KfApp, bool) {\n\ta, ok := f.Plugins[name]\n\treturn a, ok\n}\n\ntype FakeBuilder struct {\n}\n\nfunc (b *FakeBuilder) CreateKfAppCfgFile(def *kfconfig.KfConfig) (string, error) {\n\treturn path.Join(def.Spec.AppDir, kftypes.KfConfigFile), nil\n}\n\nfunc (b *FakeBuilder) LoadKfAppCfgFile(cfgFile string) (kftypes.KfApp, error) {\n\td, err := kfloaders.LoadConfigFromURI(cfgFile)\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tf := &FakeCoordinator{\n\t\tKfDef:   d,\n\t\tPlugins: make(map[string]kftypes.KfApp),\n\t}\n\n\tfor _, p := range d.Spec.Plugins {\n\t\tif p.Name == kftypes.GCP {\n\t\t\tf.Plugins[kftypes.GCP] = &gcpFake.FakeGcp{}\n\t\t\tbreak\n\t\t}\n\t}\n\treturn f, nil\n}\n"
  },
  {
    "path": "pkg/kfapp/dockerfordesktop/dockerfordesktop.go",
    "content": "/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage dockerfordesktop\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/kubeflow/kfctl/v3/config\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tkfdefs \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n)\n\n// DockerForDesktop implements KfApp Interface\n// It should include functionality needed for the dockerfordesktop platform\ntype DockerForDesktop struct {\n\tkfdefs.KfDef\n}\n\nfunc GetKfApp(kfdef *kfdefs.KfDef) kftypes.KfApp {\n\t_dockerfordesktop := &DockerForDesktop{\n\t\tKfDef: *kfdef,\n\t}\n\treturn _dockerfordesktop\n}\n\nfunc (dockerfordesktop *DockerForDesktop) Apply(resources kftypes.ResourceEnum) error {\n\t//mount_local_fs\n\t//setup_tunnels\n\treturn nil\n}\n\nfunc (dockerfordesktop *DockerForDesktop) Delete(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (dockerfordesktop *DockerForDesktop) Dump(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (dockerfordesktop *DockerForDesktop) generate() error {\n\t// remove Katib package and component\n\tdockerfordesktop.Spec.Packages = kftypes.RemoveItem(dockerfordesktop.Spec.Packages, \"katib\")\n\tdockerfordesktop.Spec.Components = kftypes.RemoveItem(dockerfordesktop.Spec.Components, \"katib\")\n\tdockerfordesktop.Spec.ComponentParams[\"application\"] = []config.NameValue{\n\t\t{\n\t\t\tName:  \"components\",\n\t\t\tValue: \"[\" + strings.Join(kftypes.QuoteItems(dockerfordesktop.Spec.Components), \",\") + \"]\",\n\t\t},\n\t}\n\tusr, err := user.Current()\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Could not get current user; error %v\", err),\n\t\t}\n\t}\n\tuid := usr.Uid\n\tgid := usr.Gid\n\tdockerfordesktop.Spec.ComponentParams[\"jupyter\"] = []config.NameValue{\n\t\t{\n\t\t\tName:  string(kftypes.PLATFORM),\n\t\t\tValue: dockerfordesktop.Spec.Platform,\n\t\t},\n\t\t{\n\t\t\tName:  \"accessLocalFs\",\n\t\t\tValue: strconv.FormatBool(dockerfordesktop.Spec.MountLocal),\n\t\t},\n\t\t{\n\t\t\tName:  \"disks\",\n\t\t\tValue: \"local-notebooks\",\n\t\t},\n\t\t{\n\t\t\tName:  \"notebookUid\",\n\t\t\tValue: uid,\n\t\t},\n\t\t{\n\t\t\tName:  \"notebookGid\",\n\t\t\tValue: gid,\n\t\t},\n\t}\n\tdockerfordesktop.Spec.ComponentParams[\"ambassador\"] = []config.NameValue{\n\t\t{\n\t\t\tName:  string(kftypes.PLATFORM),\n\t\t\tValue: dockerfordesktop.Spec.Platform,\n\t\t},\n\t\t{\n\t\t\tName:  \"replicas\",\n\t\t\tValue: \"1\",\n\t\t},\n\t}\n\treturn nil\n}\n\nfunc (dockerfordesktop *DockerForDesktop) Generate(resources kftypes.ResourceEnum) error {\n\tswitch resources {\n\tcase kftypes.K8S:\n\tcase kftypes.ALL:\n\t\tfallthrough\n\tcase kftypes.PLATFORM:\n\t\tgenerateErr := dockerfordesktop.generate()\n\t\tif generateErr != nil {\n\t\t\treturn generateErr\n\t\t}\n\t}\n\tcreateConfigErr := dockerfordesktop.writeConfigFile()\n\tif createConfigErr != nil {\n\t\treturn createConfigErr\n\t}\n\treturn nil\n}\n\nfunc (dockerfordesktop *DockerForDesktop) Init(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (dockerfordesktop *DockerForDesktop) writeConfigFile() error {\n\tbuf, bufErr := yaml.Marshal(dockerfordesktop.KfDef)\n\tif bufErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot marshal config file: %v\", bufErr),\n\t\t}\n\t}\n\tcfgFilePath := filepath.Join(dockerfordesktop.KfDef.Spec.AppDir, kftypes.KfConfigFile)\n\tcfgFilePathErr := ioutil.WriteFile(cfgFilePath, buf, 0644)\n\tif cfgFilePathErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot write config file: %v\", cfgFilePathErr),\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfapp/existing_arrikto/existing.go",
    "content": "package existing_arrikto\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\tcryptorand \"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/x509\"\n\t\"crypto/x509/pkix\"\n\t\"encoding/pem\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"net\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\tkfapisv3 \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"golang.org/x/crypto/bcrypt\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tapierrors \"k8s.io/apimachinery/pkg/api/errors\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/types\"\n\t\"k8s.io/client-go/rest\"\n\tclientcmdapi \"k8s.io/client-go/tools/clientcmd/api\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n)\n\nconst (\n\tKUBEFLOW_USER_EMAIL = \"KUBEFLOW_USER_EMAIL\"\n\tKUBEFLOW_ENDPOINT   = \"KUBEFLOW_ENDPOINT\"\n\tOIDC_ENDPOINT       = \"OIDC_ENDPOINT\"\n\n\t// Path in manifests repo to where the additional configs are located\n\tCONFIG_LOCAL_PATH = \"kfdef/generic\"\n)\n\ntype Existing struct {\n\t*kfconfig.KfConfig\n\tistioManifests    []manifest\n\tauthOIDCManifests []manifest\n}\n\ntype manifest struct {\n\tname string\n\tpath string\n}\n\nfunc GetPlatform(kfdef *kfconfig.KfConfig) (kftypesv3.Platform, error) {\n\n\tistioManifestsDir := path.Join(CONFIG_LOCAL_PATH, \"istio\")\n\tistioManifests := []manifest{\n\t\t{\n\t\t\tname: \"Istio CRDs\",\n\t\t\tpath: path.Join(istioManifestsDir, \"crds.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Istio Control Plane\",\n\t\t\tpath: path.Join(istioManifestsDir, \"istio-noauth.yaml\"),\n\t\t},\n\t}\n\n\tauthOIDCManifestsDir := path.Join(CONFIG_LOCAL_PATH, \"auth_oidc\")\n\tauthOIDCManifests := []manifest{\n\t\t{\n\t\t\tname: \"Istio Gateway\",\n\t\t\tpath: path.Join(authOIDCManifestsDir, \"gateway.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Istio Ext-Auth Envoy Filter\",\n\t\t\tpath: path.Join(authOIDCManifestsDir, \"envoy-filter.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"Dex\",\n\t\t\tpath: path.Join(authOIDCManifestsDir, \"dex.yaml\"),\n\t\t},\n\t\t{\n\t\t\tname: \"AuthService\",\n\t\t\tpath: path.Join(authOIDCManifestsDir, \"authservice.yaml\"),\n\t\t},\n\t}\n\n\texisting := &Existing{\n\t\tKfConfig:          kfdef,\n\t\tistioManifests:    istioManifests,\n\t\tauthOIDCManifests: authOIDCManifests,\n\t}\n\treturn existing, nil\n}\n\nfunc (existing *Existing) GetK8sConfig() (*rest.Config, *clientcmdapi.Config) {\n\treturn nil, nil\n}\n\nfunc (existing *Existing) Init(resources kftypesv3.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (existing *Existing) Generate(resources kftypesv3.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (existing *Existing) Apply(resources kftypesv3.ResourceEnum) error {\n\n\tif err := existing.SyncCache(); err != nil {\n\t\treturn internalError(err)\n\t}\n\n\tmanifestRepo, ok := existing.GetRepoCache(kftypesv3.ManifestsRepoName)\n\tif !ok {\n\t\treturn internalError(errors.New(\"Manifests repo is not defined.\"))\n\t}\n\tkfRepoDir := manifestRepo.LocalPath\n\n\tfor i := range existing.istioManifests {\n\t\texisting.istioManifests[i].path = path.Join(kfRepoDir, existing.istioManifests[i].path)\n\t}\n\tfor i := range existing.authOIDCManifests {\n\t\texisting.authOIDCManifests[i].path = path.Join(kfRepoDir, existing.authOIDCManifests[i].path)\n\t}\n\n\t// Apply extra components\n\tconfig := kftypesv3.GetConfig()\n\n\t// Create namespace\n\t// Get a K8s client\n\tkubeclient, err := client.New(config, client.Options{})\n\tif err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\t// Create KFApp's namespace\n\tns := &corev1.Namespace{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: existing.Namespace,\n\t\t},\n\t}\n\tlog.Infof(\"Creating namespace: %v\", ns.Name)\n\n\terr = kubeclient.Create(context.TODO(), ns)\n\tif err != nil && !apierrors.IsAlreadyExists(err) {\n\t\tlog.Errorf(\"Error creating namespace %v\", ns.Name)\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\t// Install Istio\n\tif err := applyManifests(existing.istioManifests); err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\t// Get Kubeflow and Dex Endpoints\n\tkfEndpoint, oidcEndpoint, err := getEndpoints(kubeclient)\n\tif err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\tlog.Infof(\"Got Kubeflow Endpoint: %s.\", kfEndpoint)\n\tlog.Infof(\"Got OIDC Endpoint: %s\", oidcEndpoint)\n\n\tlog.Infof(\"Creating self-signed cert for %s\", kfEndpoint)\n\tkfEndpointURL, err := url.Parse(kfEndpoint)\n\tif err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\tif err := createSelfSignedCerts(kubeclient, kfEndpointURL.Hostname()); err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\t// Get the kubeflow user to add\n\t// TODO(yanniszark): get this from a plugin struct eventually (https://github.com/kubeflow/kubeflow/issues/3529)\n\tlog.Info(\"Getting the Kubeflow User\")\n\tkubeflowUser, err := getKubeflowUser()\n\tif err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\tdata := struct {\n\t\tKubeflowEndpoint        string\n\t\tOIDCEndpoint            string\n\t\tAuthServiceClientSecret string\n\t\tKubeflowUser            *kfUser\n\t}{\n\t\tKubeflowEndpoint:        kfEndpoint,\n\t\tOIDCEndpoint:            oidcEndpoint,\n\t\tAuthServiceClientSecret: genRandomString(32),\n\t\tKubeflowUser:            kubeflowUser,\n\t}\n\n\t// Generate YAML from the dex, authservice templates\n\tauthOIDCManifestsDir := path.Join(kfRepoDir, CONFIG_LOCAL_PATH, \"auth_oidc\")\n\terr = generateFromGoTemplate(\n\t\tpath.Join(authOIDCManifestsDir, \"authservice.tmpl\"),\n\t\tpath.Join(authOIDCManifestsDir, \"authservice.yaml\"),\n\t\tdata,\n\t)\n\tif err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\terr = generateFromGoTemplate(\n\t\tpath.Join(authOIDCManifestsDir, \"dex.tmpl\"),\n\t\tpath.Join(authOIDCManifestsDir, \"dex.yaml\"),\n\t\tdata,\n\t)\n\tif err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\t// Install OIDC Authentication\n\tif err := applyManifests(existing.authOIDCManifests); err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\treturn nil\n}\n\nfunc (existing *Existing) Delete(resources kftypesv3.ResourceEnum) error {\n\n\tconfig := kftypesv3.GetConfig()\n\tkubeclient, err := client.New(config, client.Options{})\n\tif err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\n\tns := &corev1.Namespace{}\n\tfor {\n\t\terr := kubeclient.Get(context.TODO(), types.NamespacedName{Name: existing.Namespace}, ns)\n\t\t// If Namespace has been deleted, break\n\t\tif apierrors.IsNotFound(err) {\n\t\t\tbreak\n\t\t}\n\t\t// If an unknown error occured, return\n\t\tif err != nil {\n\t\t\treturn internalError(errors.WithStack(err))\n\t\t}\n\t\t// If Namespace exists, delete it\n\t\tif ns.DeletionTimestamp == nil {\n\t\t\tif err := kubeclient.Delete(context.TODO(), ns); err != nil {\n\t\t\t\treturn internalError(errors.WithStack(err))\n\t\t\t}\n\t\t}\n\t\tlog.Info(\"Waiting for namespace deletion to finish...\")\n\t\ttime.Sleep(5 * time.Second)\n\t}\n\n\trev := func(manifests []manifest) []manifest {\n\t\tr := []manifest{}\n\t\tmax := len(manifests)\n\t\tfor i := 0; i < max; i++ {\n\t\t\tr = append(r, manifests[max-1-i])\n\t\t}\n\t\treturn r\n\t}\n\n\tif err := deleteManifests(rev(existing.authOIDCManifests)); err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\tif err := deleteManifests(rev(existing.istioManifests)); err != nil {\n\t\treturn internalError(errors.WithStack(err))\n\t}\n\treturn nil\n}\n\nfunc (existing *Existing) Dump(resources kftypesv3.ResourceEnum) error {\n\treturn nil\n}\n\nfunc internalError(err error) error {\n\treturn &kfapisv3.KfError{\n\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\tMessage: fmt.Sprintf(\"%+v\", err),\n\t}\n}\n\ntype kfUser struct {\n\tUserEmail    string\n\tUsername     string\n\tPasswordHash string\n}\n\nfunc getKubeflowUser() (*kfUser, error) {\n\tkfUserEmail := os.Getenv(KUBEFLOW_USER_EMAIL)\n\tkfPassword := os.Getenv(kftypesv3.KUBEFLOW_PASSWORD)\n\tkfUsername := \"\"\n\n\tif kfUserEmail == \"\" || kfPassword == \"\" {\n\t\tlog.Warn(\"KUBEFLOW_USER_EMAIL or KUBEFLOW_PASSWORD not given. Starting without creating a user.\")\n\t\tlog.Warn(\"If you want to create a user, edit the dex ConfigMap.\")\n\t\treturn nil, nil\n\t} else if !strings.Contains(kfUserEmail, \"@\") {\n\t\treturn nil, fmt.Errorf(\"KUBEFLOW_USER_EMAIL is not a valid email (does not contain '@')\")\n\t}\n\tkfUsername = kfUserEmail[0:strings.Index(kfUserEmail, \"@\")]\n\tkfPasswordHash, err := bcrypt.GenerateFromPassword([]byte(kfPassword), 13)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlog.Infof(\"Kubeflow user with email %s will be created\", kfUserEmail)\n\treturn &kfUser{\n\t\tUserEmail:    kfUserEmail,\n\t\tUsername:     kfUsername,\n\t\tPasswordHash: string(kfPasswordHash),\n\t}, nil\n}\n\nfunc getEndpoints(kubeclient client.Client) (string, string, error) {\n\n\t// Get Istio IngressGateway Service LoadBalancer IP\n\tkfEndpoint := os.Getenv(KUBEFLOW_ENDPOINT)\n\tif !strings.HasPrefix(kfEndpoint, \"https\") && kfEndpoint != \"\" {\n\t\treturn \"\", \"\", errors.New(\"KUBEFLOW_ENDPOINT address must start with https:// scheme.\")\n\t}\n\toidcEndpoint := os.Getenv(OIDC_ENDPOINT)\n\tif !strings.HasPrefix(oidcEndpoint, \"https\") && oidcEndpoint != \"\" {\n\t\treturn \"\", \"\", errors.New(\"OIDC_ENDPOINT address must start with https:// scheme.\")\n\t}\n\n\tif kfEndpoint == \"\" {\n\t\tlbIP, err := getLBAddress(kubeclient)\n\t\tif err != nil {\n\t\t\treturn \"\", \"\", errors.WithStack(err)\n\t\t}\n\t\tkfEndpoint = fmt.Sprintf(\"https://%s\", lbIP)\n\t\tlog.Infof(\"KUBEFLOW_ENDPOINT not set, using %s\", kfEndpoint)\n\t}\n\n\tif oidcEndpoint == \"\" {\n\t\toidcEndpoint = fmt.Sprintf(\"%s:5556/dex\", kfEndpoint)\n\t\tlog.Infof(\"OIDC_ENDPOINT not set, using %s\", oidcEndpoint)\n\t}\n\n\treturn kfEndpoint, oidcEndpoint, nil\n}\n\nfunc createSelfSignedCerts(kubeclient client.Client, addr string) error {\n\n\tcert, key, err := generateCert(addr)\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\t// Create secret from them\n\tsecret := &corev1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      \"istio-ingressgateway-certs\",\n\t\t\tNamespace: \"istio-system\",\n\t\t},\n\t\tData: map[string][]byte{\n\t\t\t\"tls.crt\": cert,\n\t\t\t\"tls.key\": key,\n\t\t},\n\t}\n\n\tif err := kubeclient.Create(context.TODO(), secret); err != nil && !apierrors.IsAlreadyExists(err) {\n\t\treturn errors.WithStack(err)\n\t}\n\n\treturn nil\n}\n\n// generateCert returns the self-signed key and cert for\n// a given address.\nfunc generateCert(addr string) ([]byte, []byte, error) {\n\t// Generate private key\n\tkey, err := rsa.GenerateKey(cryptorand.Reader, 2048)\n\tif err != nil {\n\t\treturn nil, nil, errors.WithStack(err)\n\t}\n\t// Generate certificate\n\tnow := time.Now()\n\ttmpl := x509.Certificate{\n\t\tSerialNumber: new(big.Int).SetInt64(seededRand.Int63()),\n\t\tSubject: pkix.Name{\n\t\t\tCommonName:   addr,\n\t\t\tOrganization: []string{\"kubeflow-self-signed\"},\n\t\t},\n\t\tNotBefore:             now.UTC(),\n\t\tNotAfter:              now.Add(time.Second * 60 * 60 * 24 * 365).UTC(),\n\t\tKeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,\n\t\tBasicConstraintsValid: true,\n\t\tIsCA:                  true,\n\t}\n\n\tif ip := net.ParseIP(addr); ip != nil {\n\t\ttmpl.IPAddresses = append(tmpl.IPAddresses, ip)\n\t} else {\n\t\ttmpl.DNSNames = append(tmpl.DNSNames, addr)\n\t}\n\n\ttmpl.DNSNames = append(tmpl.DNSNames, \"localhost\")\n\n\tcertDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &tmpl, &tmpl, key.Public(), key)\n\tif err != nil {\n\t\treturn nil, nil, errors.WithStack(err)\n\t}\n\tcertificate, err := x509.ParseCertificate(certDERBytes)\n\tif err != nil {\n\t\treturn nil, nil, errors.WithStack(err)\n\t}\n\n\t// PEM Encode both\n\tcertBuffer := bytes.Buffer{}\n\tif err := pem.Encode(&certBuffer, &pem.Block{\n\t\tType:  \"CERTIFICATE\",\n\t\tBytes: certificate.Raw,\n\t}); err != nil {\n\t\treturn nil, nil, errors.WithStack(err)\n\t}\n\n\tkeyBuffer := bytes.Buffer{}\n\tif err := pem.Encode(&keyBuffer, &pem.Block{\n\t\tType:  \"RSA PRIVATE KEY\",\n\t\tBytes: x509.MarshalPKCS1PrivateKey(key),\n\t}); err != nil {\n\t\treturn nil, nil, errors.WithStack(err)\n\t}\n\n\treturn certBuffer.Bytes(), keyBuffer.Bytes(), nil\n}\n\nfunc getLBAddress(kubeclient client.Client) (string, error) {\n\t// Get IngressGateway Service's address\n\tconst maxRetries = 80\n\tvar lbIngresses []corev1.LoadBalancerIngress\n\tsvc := &corev1.Service{}\n\tlbServiceName := types.NamespacedName{Name: \"istio-ingressgateway\", Namespace: \"istio-system\"}\n\n\tfor i := 0; ; i++ {\n\t\tlog.Info(\"Trying to get istio-ingressgateway Service Address from its Status\")\n\n\t\terr := kubeclient.Get(\n\t\t\tcontext.TODO(),\n\t\t\tlbServiceName,\n\t\t\tsvc,\n\t\t)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Error trying to get istio-ingressgateway service\")\n\t\t\treturn \"\", err\n\t\t}\n\t\tif svc.Status.LoadBalancer.Ingress != nil {\n\t\t\tlbIngresses = svc.Status.LoadBalancer.Ingress\n\t\t\tbreak\n\t\t}\n\t\tif i == maxRetries {\n\t\t\treturn \"\", errors.New(\"timed out while waiting to get istio-ingressgateway Service Address from its Status\")\n\t\t}\n\t\ttime.Sleep(10 * time.Second)\n\t}\n\n\tfor _, lbIngress := range lbIngresses {\n\t\t// Hostname is preferred over IP\n\t\tif lbIngress.Hostname != \"\" {\n\t\t\treturn lbIngress.Hostname, nil\n\t\t}\n\t\tif lbIngress.IP != \"\" {\n\t\t\treturn lbIngress.IP, nil\n\t\t}\n\t}\n\treturn \"\", errors.New(fmt.Sprintf(\"Couldn't find a LoadBalancer address in Service's %v Status.\", lbServiceName))\n}\n\nfunc applyManifests(manifests []manifest) error {\n\tconfig := kftypesv3.GetConfig()\n\tfor _, m := range manifests {\n\t\tlog.Infof(\"Installing %s...\", m.name)\n\t\terr := utils.CreateResourceFromFile(\n\t\t\tconfig,\n\t\t\tm.path,\n\t\t)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to create %s: %v\", m.name, err)\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc deleteManifests(manifests []manifest) error {\n\tconfig := kftypesv3.GetConfig()\n\tfor _, m := range manifests {\n\t\tlog.Infof(\"Deleting %s...\", m.name)\n\t\tif _, err := os.Stat(m.path); os.IsNotExist(err) {\n\t\t\tlog.Warnf(\"File %s not found\", m.path)\n\t\t\tcontinue\n\t\t}\n\t\terr := utils.DeleteResourceFromFile(\n\t\t\tconfig,\n\t\t\tm.path,\n\t\t)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Failed to delete %s: %+v\", m.name, err)\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc generateFromGoTemplate(tmplPath, outPath string, data interface{}) error {\n\ttmpl := template.Must(template.ParseFiles(tmplPath))\n\tf, err := os.Create(outPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = tmpl.Execute(f, data)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nvar seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))\n\nfunc genRandomString(length int) string {\n\tconst charset = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n\n\tb := make([]byte, length)\n\tfor i := range b {\n\t\tb[i] = charset[seededRand.Intn(len(charset))]\n\t}\n\treturn string(b)\n}\n"
  },
  {
    "path": "pkg/kfapp/existing_arrikto/existing_test.go",
    "content": "package existing_arrikto\n\nimport (\n\t\"crypto/tls\"\n\tcorev1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"log\"\n\t\"os\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client/fake\"\n\t\"testing\"\n)\n\nfunc TestGenerateCert(t *testing.T) {\n\tcases := []struct {\n\t\tname        string\n\t\taddr        string\n\t\texpectError bool\n\t}{\n\t\t{\n\t\t\tname:        \"ip\",\n\t\t\taddr:        \"10.0.93.8\",\n\t\t\texpectError: false,\n\t\t},\n\t\t{\n\t\t\tname:        \"dns missing scheme\",\n\t\t\taddr:        \"customdnsdomain.com\",\n\t\t\texpectError: false,\n\t\t},\n\t\t{\n\t\t\tname:        \"invalid ip\",\n\t\t\taddr:        \"451.4.4\",\n\t\t\texpectError: true,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(c.name, func(t *testing.T) {\n\t\t\tcertPEM, keyPEM, err := generateCert(c.addr)\n\t\t\tif err != nil {\n\t\t\t\tif !c.expectError {\n\t\t\t\t\tt.Fatalf(\"Unexpected error occured: %+v\", err)\n\t\t\t\t} else {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcert, err := tls.X509KeyPair(certPEM, keyPEM)\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatalf(\"Unexpected error while loading keypair: %+v\", cert)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetEndpoints(t *testing.T) {\n\tcases := []struct {\n\t\tname                     string\n\t\tkubeflowEndpoint         string\n\t\toidcEndpoint             string\n\t\texpectedKubeflowEndpoint string\n\t\texpectedOIDCEndpoint     string\n\t\texpectError              bool\n\t}{\n\t\t{\n\t\t\tname:                     \"ip\",\n\t\t\tkubeflowEndpoint:         \"https://172.56.12.125\",\n\t\t\texpectedKubeflowEndpoint: \"https://172.56.12.125\",\n\t\t\texpectedOIDCEndpoint:     \"https://172.56.12.125:5556/dex\",\n\t\t\texpectError:              false,\n\t\t},\n\t\t{\n\t\t\tname:                     \"hostname\",\n\t\t\tkubeflowEndpoint:         \"https://example.com\",\n\t\t\texpectedKubeflowEndpoint: \"https://example.com\",\n\t\t\texpectedOIDCEndpoint:     \"https://example.com:5556/dex\",\n\t\t\texpectError:              false,\n\t\t},\n\t\t{\n\t\t\tname:             \"ip without scheme\",\n\t\t\tkubeflowEndpoint: \"172.56.12.125\",\n\t\t\texpectError:      true,\n\t\t},\n\t\t{\n\t\t\tname:             \"hostname without scheme\",\n\t\t\tkubeflowEndpoint: \"example.com\",\n\t\t\texpectError:      true,\n\t\t},\n\t\t{\n\t\t\tname:                     \"predetermined\",\n\t\t\tkubeflowEndpoint:         \"https://172.56.12.125\",\n\t\t\toidcEndpoint:             \"https://172.56.12.125:5556/dex\",\n\t\t\texpectedKubeflowEndpoint: \"https://172.56.12.125\",\n\t\t\texpectedOIDCEndpoint:     \"https://172.56.12.125:5556/dex\",\n\t\t\texpectError:              false,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tt.Run(c.name, func(t *testing.T) {\n\t\t\tos.Setenv(KUBEFLOW_ENDPOINT, c.kubeflowEndpoint)\n\t\t\tos.Setenv(OIDC_ENDPOINT, c.oidcEndpoint)\n\n\t\t\tkubeflowEndpoint, oidcEndpoint, err := getEndpoints(nil)\n\n\t\t\tif err != nil {\n\t\t\t\tif !c.expectError {\n\t\t\t\t\tt.Fatalf(\"Unexpected error occured: %+v\", err)\n\t\t\t\t} else {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif kubeflowEndpoint != c.expectedKubeflowEndpoint {\n\t\t\t\tt.Fatalf(\"Wrong Kubeflow Endpoint. Got %s, expected %s.\", kubeflowEndpoint, c.expectedKubeflowEndpoint)\n\t\t\t}\n\t\t\tif oidcEndpoint != c.expectedOIDCEndpoint {\n\t\t\t\tt.Fatalf(\"Wrong Kubeflow Endpoint. Got %s, expected %s.\", oidcEndpoint, c.expectedOIDCEndpoint)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetLBAddress(t *testing.T) {\n\tcases := []struct {\n\t\tname         string\n\t\tlbIngresses  []corev1.LoadBalancerIngress\n\t\texpectedAddr string\n\t\texpectError  bool\n\t}{\n\t\t{\n\t\t\tname: \"ip\",\n\t\t\tlbIngresses: []corev1.LoadBalancerIngress{\n\t\t\t\t{\n\t\t\t\t\tIP:       \"172.56.12.125\",\n\t\t\t\t\tHostname: \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedAddr: \"172.56.12.125\",\n\t\t\texpectError:  false,\n\t\t},\n\t\t{\n\t\t\tname: \"hostname\",\n\t\t\tlbIngresses: []corev1.LoadBalancerIngress{\n\t\t\t\t{\n\t\t\t\t\tIP:       \"\",\n\t\t\t\t\tHostname: \"mydomain.com\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedAddr: \"mydomain.com\",\n\t\t\texpectError:  false,\n\t\t},\n\t\t{\n\t\t\tname: \"ip and hostname\",\n\t\t\tlbIngresses: []corev1.LoadBalancerIngress{\n\t\t\t\t{\n\t\t\t\t\tIP:       \"172.56.12.125\",\n\t\t\t\t\tHostname: \"mydomain.com\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedAddr: \"mydomain.com\",\n\t\t\texpectError:  false,\n\t\t},\n\t\t{\n\t\t\tname: \"multiple ingresses\",\n\t\t\tlbIngresses: []corev1.LoadBalancerIngress{\n\t\t\t\t{\n\t\t\t\t\tIP:       \"172.56.12.125\",\n\t\t\t\t\tHostname: \"mydomain.com\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tIP:       \"163.15.42.78\",\n\t\t\t\t\tHostname: \"otherdomain.com\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedAddr: \"mydomain.com\",\n\t\t\texpectError:  false,\n\t\t},\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\tlbIngresses: []corev1.LoadBalancerIngress{\n\t\t\t\t{\n\t\t\t\t\tIP:       \"\",\n\t\t\t\t\tHostname: \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectError: true,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\n\t\tt.Run(c.name, func(t *testing.T) {\n\t\t\tlbService := &corev1.Service{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tName:      \"istio-ingressgateway\",\n\t\t\t\t\tNamespace: \"istio-system\",\n\t\t\t\t},\n\t\t\t\tStatus: corev1.ServiceStatus{\n\t\t\t\t\tLoadBalancer: corev1.LoadBalancerStatus{\n\t\t\t\t\t\tIngress: c.lbIngresses,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tkubeclient := fake.NewFakeClient(lbService)\n\t\t\taddr, err := getLBAddress(kubeclient)\n\n\t\t\tif err != nil {\n\t\t\t\tif !c.expectError {\n\t\t\t\t\tt.Fatalf(\"Unexpected error occured: %+v\", err)\n\t\t\t\t} else {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif addr != c.expectedAddr {\n\t\t\t\tt.Fatalf(\"Wrong address. Got %s, expected %s\", addr, c.expectedAddr)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/kfapp/gcp/fake/fake.go",
    "content": "// package fake provides a fake implementation of the GCP Plugin\npackage fake\n\nimport (\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"golang.org/x/oauth2\"\n)\n\ntype FakeGcp struct {\n\tts oauth2.TokenSource\n}\n\nfunc (g *FakeGcp) Apply(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (g *FakeGcp) Delete(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (g *FakeGcp) Dump(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (g *FakeGcp) Generate(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (g *FakeGcp) Init(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (g *FakeGcp) SetTokenSource(s oauth2.TokenSource) error {\n\tg.ts = s\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfapp/gcp/gcp.go",
    "content": "/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage gcp\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"math/rand\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/cenkalti/backoff\"\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/gogo/protobuf/proto\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig/gcpplugin\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"golang.org/x/crypto/bcrypt\"\n\t\"golang.org/x/net/context\"\n\t\"golang.org/x/oauth2\"\n\t\"golang.org/x/oauth2/google\"\n\t\"google.golang.org/api/deploymentmanager/v2\"\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/api/iam/v1\"\n\t\"google.golang.org/api/servicemanagement/v1\"\n\t\"google.golang.org/api/serviceusage/v1\"\n\tv1 \"k8s.io/api/core/v1\"\n\trbacv1 \"k8s.io/api/rbac/v1\"\n\tk8serrors \"k8s.io/apimachinery/pkg/api/errors\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\t\"k8s.io/apimachinery/pkg/runtime/serializer\"\n\t\"k8s.io/client-go/discovery\"\n\t\"k8s.io/client-go/discovery/cached/memory\"\n\tclientset \"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\t\"k8s.io/client-go/rest\"\n\trestv2 \"k8s.io/client-go/rest\"\n\t\"k8s.io/client-go/restmapper\"\n\tclientcmdapi \"k8s.io/client-go/tools/clientcmd/api\"\n)\n\n// TODO: golint complains that we should not use all capital var name.\nconst (\n\tGCP_CONFIG        = \"gcp_config\"\n\tCONFIG_FILE       = \"cluster-kubeflow.yaml\"\n\tSTORAGE_FILE      = \"storage-kubeflow.yaml\"\n\tNETWORK_FILE      = \"network.yaml\"\n\tGCFS_FILE         = \"gcfs.yaml\"\n\tADMIN_SECRET_NAME = \"admin-gcp-sa\"\n\tUSER_SECRET_NAME  = \"user-gcp-sa\"\n\tKUBEFLOW_OAUTH    = \"kubeflow-oauth\"\n\tIMPORTS           = \"imports\"\n\tPATH              = \"path\"\n\tCLIENT_ID         = \"CLIENT_ID\"\n\tCLIENT_SECRET     = \"CLIENT_SECRET\"\n\tBASIC_AUTH_SECRET = \"kubeflow-login\"\n\tKUBECONFIG_FORMAT = \"gke_{project}_{zone}_{cluster}\"\n\n\t// The default path in kubeflow/kubeflow to the deployment manager configs.\n\t// TODO(jlewi): This is only provided for legacy reasons. In 0.7 the path should be set explicitly\n\t// in the KfDef spec.\n\tDEFAULT_DM_PATH = \"deployment/gke/deployment_manager_configs\"\n\n\t// Plugin parameter constants\n\tGcpPluginName               = \"KfGcpPlugin\"\n\tGcpAccessTokenName          = \"accessToken\"\n\tBasicAuthPasswordSecretName = \"password\"\n\t// The PodDefault in default namespace\n\tPodDefaultName = \"add-gcp-secret\"\n\n\tDefaultIstioNamespace = \"istio-system\"\n)\n\n// Gcp implements KfApp Interface\n// It includes the KsApp along with additional Gcp types\n// TODO(jlewi): Why doesn't Gcp store GcpArgs as opposed to duplicating the options?\ntype Gcp struct {\n\tkfDef       *kfconfig.KfConfig\n\tclient      *http.Client\n\ttokenSource oauth2.TokenSource\n\n\t// Function to get the GcpAccount.\n\t// Support injection for testing.\n\tgcpAccountGetter func() (string, error)\n\tgcpProjectGetter func() (string, error)\n\tgcpZoneGetter    func() (string, error)\n\n\trunGetCredentials bool\n}\n\ntype Setter interface {\n\tSetTokenSource(s oauth2.TokenSource) error\n\n\t// SetRunGetCredentials controls whether or not to run get credentials\n\tSetRunGetCredentials(v bool)\n}\n\nfunc (gcp *Gcp) SetTokenSource(s oauth2.TokenSource) error {\n\tgcp.tokenSource = s\n\t// Reset client to force pick up the new token\n\tgcp.client = nil\n\treturn nil\n}\n\nfunc (gcp *Gcp) SetRunGetCredentials(v bool) {\n\tgcp.runGetCredentials = v\n}\n\ntype dmOperationEntry struct {\n\toperationName string\n\t// create or update dmName\n\taction string\n}\n\n// GetPlatform returns the gcp kfapp. It's called by coordinator.GetPlatform\nfunc GetPlatform(kfdef *kfconfig.KfConfig) (kftypesv3.Platform, error) {\n\n\t_gcp := &Gcp{\n\t\tkfDef:            kfdef,\n\t\tgcpAccountGetter: GetGcloudDefaultAccount,\n\t\tgcpProjectGetter: GetGcloudDefaultProject,\n\t\tgcpZoneGetter:    GetGcloudDefaultZone,\n\t\t// Default to true for the CLI.\n\t\trunGetCredentials: true,\n\t}\n\treturn _gcp, nil\n}\n\n// GetPluginSpec gets the plugin spec.\nfunc (gcp *Gcp) GetPluginSpec() (*gcpplugin.GcpPluginSpec, error) {\n\t// Not passing a pointer interface is a common cause of deserialization problems\n\tpluginSpec := &gcpplugin.GcpPluginSpec{}\n\n\terr := gcp.kfDef.GetPluginSpec(GcpPluginName, pluginSpec)\n\n\treturn pluginSpec, err\n}\n\n// initGcpClient initializes the clients to talk to GCP.\nfunc (gcp *Gcp) initGcpClient() error {\n\tif gcp.client != nil {\n\t\tlog.Infof(\"GCP client already configured\")\n\t\treturn nil\n\t}\n\n\tctx := context.Background()\n\n\tif gcp.tokenSource == nil {\n\t\t// Defensive Programming.\n\t\t// If we try to create a DefaultTokenSource when an AccessToken is provided\n\t\t// Something has gone wrong. So we guard against that.\n\t\t// If accessToken is provided gcp.TokenSource should be set and we should use\n\t\t// that.\n\t\tif _, err := gcp.kfDef.GetSecret(GcpAccessTokenName); !kfconfig.IsSecretNotFound(err) {\n\t\t\treturn errors.WithStack(fmt.Errorf(\"Gcp.tokenSource is nil and secret %v is in KfDef; Gcp.tokenSource must be set explicitly; using a default token source is not allowed in this case\", GcpAccessTokenName))\n\t\t}\n\t\tlog.Infof(\"Creating default token source\")\n\t\ttokenSource, err := google.DefaultTokenSource(ctx, iam.CloudPlatformScope)\n\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"initGcpClient failed to create default token source\")\n\t\t}\n\n\t\tgcp.tokenSource = tokenSource\n\t} else {\n\t\tlog.Infof(\"Using current token source\")\n\t}\n\n\tlog.Infof(\"Creating GCP client.\")\n\tgcp.client = oauth2.NewClient(ctx, gcp.tokenSource)\n\n\treturn nil\n}\n\nfunc newDefaultBackoff() *backoff.ExponentialBackOff {\n\tb := backoff.NewExponentialBackOff()\n\tb.InitialInterval = 3 * time.Second\n\tb.MaxInterval = 30 * time.Second\n\treturn b\n}\n\nfunc getSA(name string, nameSuffix string, project string) string {\n\treturn fmt.Sprintf(\"%v-%v@%v.iam.gserviceaccount.com\", name, nameSuffix, project)\n}\n\n// TODO(jlewi): We should be able to get rid of this method because it was only used\n// for ksonnet.\nfunc (gcp *Gcp) GetK8sConfig() (*rest.Config, *clientcmdapi.Config) {\n\t// TODO(jlewi): Should we unify the code by just setting ts and then calling\n\t// ts.Tpken to get a token?\n\taccessToken, _ := gcp.kfDef.GetSecret(GcpAccessTokenName)\n\n\tif accessToken == \"\" {\n\t\treturn nil, nil\n\t}\n\tctx := context.Background()\n\n\t// TODO(jlewi): Should we fix this so we can build a cluster config which takes\n\t// a TokenSource which can then be pointed at either the DefaultTokenSource\n\t// or the refreshable token source?\n\trestConfig, err := utils.BuildClusterConfig(ctx, accessToken, gcp.kfDef.Spec.Project,\n\t\tgcp.kfDef.Spec.Zone, gcp.kfDef.Name)\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\tapiConfig := utils.BuildClientCmdAPI(restConfig, accessToken)\n\treturn restConfig, apiConfig\n}\n\n// GetGcloudDefaultProject try to get the default project.\nfunc GetGcloudDefaultProject() (string, error) {\n\toutput, err := exec.Command(\"gcloud\", \"config\", \"get-value\", \"project\").Output()\n\tif err != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not call 'gcloud config get-value project': %v\", err),\n\t\t}\n\t}\n\treturn strings.TrimSpace(string(output)), nil\n}\n\n// GetGcloudDefaultZone try to get the default zone.\nfunc GetGcloudDefaultZone() (string, error) {\n\toutput, err := exec.Command(\"gcloud\", \"config\", \"get-value\", \"compute/zone\").Output()\n\tif err != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not call 'gcloud config get-value compute/zone': %v\", err),\n\t\t}\n\t}\n\treturn strings.TrimSpace(string(output)), nil\n}\n\n// GetGcloudDefaultAccount try to get the default account.\nfunc GetGcloudDefaultAccount() (string, error) {\n\toutput, err := exec.Command(\"gcloud\", \"config\", \"get-value\", \"account\").Output()\n\tif err != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not call 'gcloud config get-value account': %v\", err),\n\t\t}\n\t}\n\treturn strings.TrimSpace(string(output)), nil\n}\n\n// Simple deploymentmanager.TargetConfiguration factory method. This method assumes imported paths\n// are all within the same filesystem. From gcloud CLI source codes it appears URL is a possible\n// option. We might need to update this method or find a way to work with Python source code from\n// gcloud.\nfunc generateTarget(configPath string) (*deploymentmanager.TargetConfiguration, error) {\n\tif !filepath.IsAbs(configPath) {\n\t\tif p, err := filepath.Abs(configPath); err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Getting absolute path error: %v\", err),\n\t\t\t}\n\t\t} else {\n\t\t\tconfigPath = p\n\t\t}\n\t}\n\tlog.Infof(\"Reading config file: %v\", configPath)\n\tconfigBuf, bufErr := ioutil.ReadFile(configPath)\n\tif bufErr != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Reading config file error: %v\", bufErr),\n\t\t}\n\t}\n\ttargetConfig := &deploymentmanager.TargetConfiguration{\n\t\tConfig: &deploymentmanager.ConfigFile{\n\t\t\tContent: string(configBuf),\n\t\t},\n\t}\n\n\tvar config map[string]interface{}\n\tif err := yaml.Unmarshal(configBuf, &config); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Unable to read YAML: %v\", err),\n\t\t}\n\t}\n\tif _, ok := config[IMPORTS]; !ok {\n\t\treturn targetConfig, nil\n\t}\n\n\tentries := config[IMPORTS].([]interface{})\n\tdirName := filepath.Dir(configPath)\n\tfor _, entry := range entries {\n\t\tentryMap := entry.(map[string]interface{})\n\t\tif _, ok := entryMap[PATH]; !ok {\n\t\t\tcontinue\n\t\t}\n\t\timportPath := entryMap[PATH].(string)\n\t\tif !filepath.IsAbs(importPath) {\n\t\t\timportPath = path.Join(dirName, importPath)\n\t\t}\n\t\tlog.Infof(\"Reading import file: %v\", importPath)\n\t\tif buf, err := ioutil.ReadFile(importPath); err == nil {\n\t\t\ttargetConfig.Imports = append(targetConfig.Imports, &deploymentmanager.ImportFile{\n\t\t\t\tName:    entryMap[PATH].(string),\n\t\t\t\tContent: string(buf),\n\t\t\t})\n\t\t} else {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"error reading import file: %v\", err),\n\t\t\t}\n\t\t}\n\t}\n\treturn targetConfig, nil\n}\n\nfunc (gcp *Gcp) getK8sClientset(ctx context.Context) (*clientset.Clientset, error) {\n\tcluster, err := utils.GetClusterInfo(ctx, gcp.kfDef.Spec.Project,\n\t\tgcp.kfDef.Spec.Zone, gcp.kfDef.Name, gcp.tokenSource)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"get Cluster error: %v\", err),\n\t\t}\n\t}\n\tconfig, err := utils.BuildConfigFromClusterInfo(ctx, cluster, gcp.tokenSource)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"build ClientConfig error: %v\", err),\n\t\t}\n\t}\n\n\tif cli, err := clientset.NewForConfig(config); err == nil {\n\t\treturn cli, nil\n\t} else {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"create new ClientConfig error: %v\", err),\n\t\t}\n\t}\n}\n\nfunc blockingWait(project string, deploymentmanagerService *deploymentmanager.Service,\n\tdmOperationEntries []*dmOperationEntry) error {\n\tctx := context.Background()\n\t// Explicitly copy string to avoid memory leak.\n\tp := \"\" + project\n\treturn backoff.Retry(func() error {\n\t\tfor _, dmEntry := range dmOperationEntries {\n\t\t\top, err := deploymentmanagerService.Operations.Get(p, dmEntry.operationName).Context(ctx).Do()\n\n\t\t\tif err != nil {\n\t\t\t\t// Retry here as there's a chance to get error for newly created DM operation.\n\t\t\t\tlog.Errorf(\"%v error: %v\", dmEntry.action, err)\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"%v error: %v\", dmEntry.action, err),\n\t\t\t\t}\n\t\t\t}\n\t\t\tif op.Error != nil {\n\t\t\t\tfor _, e := range op.Error.Errors {\n\t\t\t\t\tlog.Errorf(\"%v error: %+v\", dmEntry.action, e)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif op.Status != \"DONE\" {\n\t\t\t\tlog.Infof(\"%v status: %v (op = %v)\", dmEntry.action, op.Status, op.Name)\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: fmt.Sprintf(\"%v did not succeed; status: %v (op = %v)\",\n\t\t\t\t\t\tdmEntry.action, op.Status, op.Name),\n\t\t\t\t}\n\t\t\t}\n\t\t\tif op.HttpErrorStatusCode > 0 {\n\t\t\t\treturn backoff.Permanent(&kfapis.KfError{\n\t\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: fmt.Sprintf(\"%v error(%v): %v\",\n\t\t\t\t\t\tdmEntry.action,\n\t\t\t\t\t\top.HttpErrorStatusCode, op.HttpErrorMessage),\n\t\t\t\t})\n\t\t\t}\n\t\t\tlog.Infof(\"%v is finished: %v\", dmEntry.action, op.Status)\n\t\t}\n\t\treturn nil\n\t}, newDefaultBackoff())\n}\n\nfunc (gcp *Gcp) updateDeployment(deploymentmanagerService *deploymentmanager.Service, deployment string, yamlfile string) (*dmOperationEntry, error) {\n\tappDir := gcp.kfDef.Spec.AppDir\n\tgcpConfigDir := path.Join(appDir, GCP_CONFIG)\n\tctx := context.Background()\n\n\tfilePath := filepath.Join(gcpConfigDir, yamlfile)\n\tdp := &deploymentmanager.Deployment{\n\t\tName:   deployment,\n\t\tLabels: []*deploymentmanager.DeploymentLabelEntry{},\n\t}\n\n\t// Add the labels\n\tfor k, v := range gcp.kfDef.Labels {\n\t\tdp.Labels = append(dp.Labels, &deploymentmanager.DeploymentLabelEntry{\n\t\t\tKey:   k,\n\t\t\tValue: v,\n\t\t})\n\t}\n\n\tif target, targetErr := generateTarget(filePath); targetErr != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: targetErr.Error(),\n\t\t}\n\t} else {\n\t\tdp.Target = target\n\t}\n\n\tproject := gcp.kfDef.Spec.Project\n\tresp, err := deploymentmanagerService.Deployments.Get(project, deployment).Context(ctx).Do()\n\tif err == nil {\n\t\tdp.Fingerprint = resp.Fingerprint\n\t\topName := resp.Operation.Name\n\t\tif resp.Operation.Status == \"DONE\" {\n\t\t\tlog.Infof(\"Updating deployment %v\", deployment)\n\t\t\top, updateErr := deploymentmanagerService.Deployments.Update(project, deployment, dp).Context(ctx).Do()\n\t\t\tif updateErr != nil {\n\t\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.UNKNOWN),\n\t\t\t\t\tMessage: fmt.Sprintf(\"Update deployment error: %v\", updateErr),\n\t\t\t\t}\n\t\t\t}\n\t\t\topName = op.Name\n\t\t} else {\n\t\t\tlog.Infof(\"Wait running deployment %v to finish; operation name: %v.\", deployment, opName)\n\t\t}\n\t\treturn &dmOperationEntry{\n\t\t\toperationName: opName,\n\t\t\taction:        \"Updating \" + deployment,\n\t\t}, nil\n\t} else {\n\t\tlog.Infof(\"Creating deployment %v\", deployment)\n\t\top, insertErr := deploymentmanagerService.Deployments.Insert(project, dp).Context(ctx).Do()\n\t\tif insertErr != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"Insert deployment error: %v\", insertErr),\n\t\t\t}\n\t\t}\n\t\treturn &dmOperationEntry{\n\t\t\toperationName: op.Name,\n\t\t\taction:        \"Creating \" + deployment,\n\t\t}, nil\n\t}\n}\n\nfunc createNamespace(k8sClientset *clientset.Clientset, namespace string) error {\n\tlog.Infof(\"Creating namespace: %v\", namespace)\n\t_, err := k8sClientset.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{})\n\tif err == nil {\n\t\tlog.Infof(\"Namespace already exists...\")\n\t\treturn nil\n\t}\n\tlog.Infof(\"Get namespace error: %v\", err)\n\t_, err = k8sClientset.CoreV1().Namespaces().Create(\n\t\t&v1.Namespace{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName: namespace,\n\t\t\t},\n\t\t},\n\t)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\nfunc bindAdmin(k8sClientset *clientset.Clientset, user string) error {\n\tlog.Infof(\"Binding admin role for %v ...\", user)\n\tdefaultAdmin := \"default-admin\"\n\t_, err := k8sClientset.RbacV1().ClusterRoleBindings().Get(defaultAdmin,\n\t\tmetav1.GetOptions{\n\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\tAPIVersion: \"rbac.authorization.k8s.io/v1beta1\",\n\t\t\t\tKind:       \"ClusterRoleBinding\",\n\t\t\t},\n\t\t})\n\n\tbinding := &rbacv1.ClusterRoleBinding{\n\t\tTypeMeta: metav1.TypeMeta{\n\t\t\tAPIVersion: \"rbac.authorization.k8s.io/v1beta1\",\n\t\t\tKind:       \"ClusterRoleBinding\",\n\t\t},\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName: \"default-admin\",\n\t\t},\n\t\tRoleRef: rbacv1.RoleRef{\n\t\t\tAPIGroup: \"rbac.authorization.k8s.io\",\n\t\t\tKind:     \"ClusterRole\",\n\t\t\tName:     \"cluster-admin\",\n\t\t},\n\t\tSubjects: []rbacv1.Subject{\n\t\t\t{\n\t\t\t\tKind: rbacv1.UserKind,\n\t\t\t\tName: user,\n\t\t\t},\n\t\t},\n\t}\n\tif err == nil {\n\t\tlog.Infof(\"Updating default-admin...\")\n\t\t_, err = k8sClientset.RbacV1().ClusterRoleBindings().Update(binding)\n\t} else {\n\t\tlog.Infof(\"Default-admin not found, creating...\")\n\t\t_, err = k8sClientset.RbacV1().ClusterRoleBindings().Create(binding)\n\t}\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\nfunc (gcp *Gcp) ConfigK8s() error {\n\tctx := context.Background()\n\tk8sClientset, err := gcp.getK8sClientset(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = createNamespace(k8sClientset, gcp.kfDef.Namespace); err != nil {\n\t\treturn err\n\t}\n\tif err = createNamespace(k8sClientset, gcp.getIstioNamespace()); err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"cannot create istio namespace\"))\n\t}\n\t// For deploy app, request will use service account credential instead of user credential.\n\tbindAccount := gcp.kfDef.Spec.Email\n\n\tpluginSpec, err := gcp.GetPluginSpec()\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif pluginSpec.SAClientId != \"\" {\n\t\tlog.Infof(\"Granting service account K8s permission.\")\n\t\tbindAccount = pluginSpec.SAClientId\n\t}\n\n\tif err = bindAdmin(k8sClientset, bindAccount); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Add a conveniently named context to KUBECONFIG.\nfunc (gcp *Gcp) AddNamedContext() error {\n\tname := strings.Replace(KUBECONFIG_FORMAT, \"{project}\", gcp.kfDef.Spec.Project, 1)\n\tname = strings.Replace(name, \"{zone}\", gcp.kfDef.Spec.Zone, 1)\n\tname = strings.Replace(name, \"{cluster}\", gcp.kfDef.Name, 1)\n\tlog.Infof(\"KUBECONFIG name is %v\", name)\n\n\tbuf, err := ioutil.ReadFile(kftypesv3.KubeConfigPath())\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Reading KUBECONFIG error: %v\", err),\n\t\t}\n\t}\n\tvar config map[string]interface{}\n\tif err = yaml.Unmarshal(buf, &config); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Unmarshaling KUBECONFIG error: %v\", err),\n\t\t}\n\t}\n\n\tconfigNameChecker := func(config map[string]interface{}, entryName string, name string) error {\n\t\te, ok := config[entryName]\n\t\tif !ok {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Not able to find %v in KUBECONFIG\", entryName),\n\t\t\t}\n\t\t}\n\t\tentries := e.([]interface{})\n\t\tfor _, entry := range entries {\n\t\t\ten := entry.(map[string]interface{})\n\t\t\tif mm, ok := en[\"name\"]; ok {\n\t\t\t\tn := mm.(string)\n\t\t\t\tif n == name {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: \"Not able to find name in the entry\",\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Not able to find %v from %v in KUBECONFIG\", name, entryName),\n\t\t}\n\t}\n\n\tif err = configNameChecker(config, \"clusters\", name); err != nil {\n\t\treturn err\n\t}\n\tif err = configNameChecker(config, \"users\", name); err != nil {\n\t\treturn err\n\t}\n\tif err = configNameChecker(config, \"contexts\", name); err != nil {\n\t\treturn err\n\t}\n\n\te, ok := config[\"contexts\"]\n\tif !ok {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"Not able to find contexts in KUBECONFIG\",\n\t\t}\n\t}\n\tcontexts := e.([]interface{})\n\tcontext := make(map[string]interface{})\n\tcontext[\"name\"] = gcp.kfDef.Name\n\tcontext[\"context\"] = map[string]string{\n\t\t\"cluster\":   name,\n\t\t\"user\":      name,\n\t\t\"namespace\": gcp.kfDef.Namespace,\n\t}\n\tfor idx, ctx := range contexts {\n\t\tc := ctx.(map[string]interface{})\n\t\tif c[\"name\"] == gcp.kfDef.Name {\n\t\t\t// Remove the entry to override.\n\t\t\tcontexts = append(contexts[:idx], contexts[idx+1:]...)\n\t\t\tbreak\n\t\t}\n\t}\n\tcontexts = append(contexts, context)\n\tconfig[\"contexts\"] = contexts\n\tconfig[\"current-context\"] = gcp.kfDef.Name\n\n\tbuf, err = yaml.Marshal(config)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when marshaling KUBECONFIG: %v\", err),\n\t\t}\n\t}\n\tif err = ioutil.WriteFile(kftypesv3.KubeConfigPath(), buf, 0644); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when writing KUBECONFIG: %v\", err),\n\t\t}\n\t}\n\n\tlog.Infof(\"KUBECONFIG context %v is created and currently using\", gcp.kfDef.Name)\n\treturn nil\n}\n\nfunc (gcp *Gcp) updateDM(resources kftypesv3.ResourceEnum) error {\n\tctx := context.Background()\n\tgcpClient := oauth2.NewClient(ctx, gcp.tokenSource)\n\tdmOperationEntries := []*dmOperationEntry{}\n\tdeploymentmanagerService, err := deploymentmanager.New(gcp.client)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error creating deploymentmanagerService: %v\", err),\n\t\t}\n\t}\n\t// DM entries are optional, defined in kfdef config. We only make DM changes when DM config was generated during kfctl build\n\tif _, storageStatErr := os.Stat(path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG, STORAGE_FILE)); !os.IsNotExist(storageStatErr) {\n\t\tif storageStatErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"Error creating deploymentmanager storage: %v\", storageStatErr),\n\t\t\t}\n\t\t}\n\t\tstorageEntry, err := gcp.updateDeployment(deploymentmanagerService, gcp.kfDef.Name+\"-storage\", STORAGE_FILE)\n\t\tif err != nil {\n\t\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"could not update %v\", STORAGE_FILE))\n\t\t}\n\t\tdmOperationEntries = append(dmOperationEntries, storageEntry)\n\t}\n\tif _, mainStatErr := os.Stat(path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG, CONFIG_FILE)); !os.IsNotExist(mainStatErr) {\n\t\tif mainStatErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"Error creating deploymentmanager Service: %v\", mainStatErr),\n\t\t\t}\n\t\t}\n\t\tdmEntry, err := gcp.updateDeployment(deploymentmanagerService, gcp.kfDef.Name, CONFIG_FILE)\n\t\tif err != nil {\n\t\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"could not update %v\", CONFIG_FILE))\n\t\t}\n\t\tdmOperationEntries = append(dmOperationEntries, dmEntry)\n\t}\n\tif _, networkStatErr := os.Stat(path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG, NETWORK_FILE)); !os.IsNotExist(networkStatErr) {\n\t\tif networkStatErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"Error creating deploymentmanager Network: %v\", networkStatErr),\n\t\t\t}\n\t\t}\n\t\tnetworkEntry, err := gcp.updateDeployment(deploymentmanagerService, gcp.kfDef.Name+\"-network\", NETWORK_FILE)\n\t\tif err != nil {\n\t\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"could not update %v\", NETWORK_FILE))\n\t\t}\n\t\tdmOperationEntries = append(dmOperationEntries, networkEntry)\n\t}\n\tif _, gcfsStatErr := os.Stat(path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG, GCFS_FILE)); !os.IsNotExist(gcfsStatErr) {\n\t\tif gcfsStatErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"Error creating deploymentmanager gcfs: %v\", gcfsStatErr),\n\t\t\t}\n\t\t}\n\t\tgcfsEntry, err := gcp.updateDeployment(deploymentmanagerService, gcp.kfDef.Name+\"-gcfs\", GCFS_FILE)\n\t\tif err != nil {\n\t\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"could not update %v\", GCFS_FILE))\n\t\t}\n\t\tdmOperationEntries = append(dmOperationEntries, gcfsEntry)\n\t}\n\n\tif err = blockingWait(gcp.kfDef.Spec.Project, deploymentmanagerService, dmOperationEntries); err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, \"could not update deployment manager entries\")\n\t}\n\n\t// IAM changes are optional, defined in kfdef config. We only make IAM changes when IAM config was generated during kfctl build\n\tif _, iamStatErr := os.Stat(path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG, \"iam_bindings.yaml\")); !os.IsNotExist(iamStatErr) {\n\t\tif iamStatErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"Error loading IAM template: %v\", iamStatErr),\n\t\t\t}\n\t\t}\n\t\texp := backoff.NewExponentialBackOff()\n\t\texp.InitialInterval = 1 * time.Second\n\t\texp.MaxInterval = 3 * time.Second\n\t\texp.MaxElapsedTime = time.Minute\n\t\texp.Reset()\n\t\terr = backoff.Retry(func() error {\n\t\t\t// Get current policy\n\t\t\tpolicy, policyErr := utils.GetIamPolicy(gcp.kfDef.Spec.Project, gcpClient)\n\t\t\tif policyErr != nil {\n\t\t\t\treturn kfapis.NewKfErrorWithMessage(policyErr, \"GetIamPolicy error\")\n\t\t\t}\n\t\t\tutils.ClearIamPolicy(policy, gcp.kfDef.Name, gcp.kfDef.Spec.Project)\n\t\t\tif err := utils.SetIamPolicy(gcp.kfDef.Spec.Project, policy, gcpClient); err != nil {\n\t\t\t\treturn kfapis.NewKfErrorWithMessage(err, \"Set Cleared IamPolicy error: %v\")\n\t\t\t}\n\t\t\treturn nil\n\t\t}, exp)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tappDir := gcp.kfDef.Spec.AppDir\n\t\tgcpConfigDir := path.Join(appDir, GCP_CONFIG)\n\t\tiamPolicy, iamPolicyErr := utils.ReadIamBindingsYAML(\n\t\t\tfilepath.Join(gcpConfigDir, \"iam_bindings.yaml\"))\n\t\tif iamPolicyErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: iamPolicyErr.(*kfapis.KfError).Code,\n\t\t\t\tMessage: fmt.Sprintf(\"Read IAM policy YAML error: %v\",\n\t\t\t\t\tiamPolicyErr.(*kfapis.KfError).Message),\n\t\t\t}\n\t\t}\n\n\t\texp.Reset()\n\t\terr = backoff.Retry(func() error {\n\t\t\t// Need to read policy again as latest Etag changed.\n\t\t\tnewPolicy, policyErr := utils.GetIamPolicy(gcp.kfDef.Spec.Project, gcpClient)\n\t\t\tif policyErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: policyErr.(*kfapis.KfError).Code,\n\t\t\t\t\tMessage: fmt.Sprintf(\"GetIamPolicy error: %v\",\n\t\t\t\t\t\tpolicyErr.(*kfapis.KfError).Message),\n\t\t\t\t}\n\t\t\t}\n\t\t\tutils.RewriteIamPolicy(newPolicy, iamPolicy)\n\t\t\tif err := utils.SetIamPolicy(gcp.kfDef.Spec.Project, newPolicy, gcpClient); err != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\t\t\tMessage: fmt.Sprintf(\"Set New IamPolicy error: %v\",\n\t\t\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}, exp)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif err := gcp.ConfigK8s(); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Configure K8s is failed: %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\tif gcp.runGetCredentials {\n\t\tlog.Infof(\"Running get-credentials to build .kubeconfig\")\n\t\tcredCmd := exec.Command(\"gcloud\", \"container\", \"clusters\", \"get-credentials\",\n\t\t\tgcp.kfDef.Name,\n\t\t\t\"--zone=\"+gcp.kfDef.Spec.Zone,\n\t\t\t\"--project=\"+gcp.kfDef.Spec.Project)\n\t\tcredCmd.Stdout = os.Stdout\n\t\tcredCmd.Stderr = os.Stderr\n\t\tlog.Infof(\"Running get-credentials %v --zone=%v --project=%v ...\", gcp.kfDef.Name,\n\t\t\tgcp.kfDef.Spec.Zone, gcp.kfDef.Spec.Project)\n\t\tif err := credCmd.Run(); err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Error when running gcloud container clusters get-credentials: %v\", err),\n\t\t\t}\n\t\t}\n\t\tif _, err := os.Stat(kftypesv3.KubeConfigPath()); !os.IsNotExist(err) {\n\t\t\tgcp.AddNamedContext()\n\t\t}\n\t} else {\n\t\tlog.Debugf(\"Not running gcloud get-credentials\")\n\t}\n\treturn nil\n}\n\n// Apply applies the gcp kfapp.\n// Remind: Need to be thread-safe: this entry is share among kfctl and deploy app\nfunc (gcp *Gcp) Apply(resources kftypesv3.ResourceEnum) error {\n\tif err := gcp.initGcpClient(); err != nil {\n\t\tlog.Errorf(\"There was a problem initializing the GCP client; %v\", err)\n\t\treturn errors.WithMessagef(err, \"Gcp.Apply Could not initatie a GCP client\")\n\t}\n\n\tp, err := gcp.GetPluginSpec()\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = p.IsValid(); err != nil {\n\t\tlog.Errorf(\"GcpPluginSpec isn't valid; error %v\", err)\n\t\treturn err\n\t}\n\n\t// Update deployment manager\n\tupdateDMErr := gcp.updateDM(resources)\n\tif updateDMErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: updateDMErr.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"gcp apply could not update deployment manager: %v\",\n\t\t\t\tupdateDMErr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\t// Insert secrets into the cluster\n\tsecretsErr := gcp.createSecrets()\n\tif secretsErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: secretsErr.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"gcp apply could not create secrets: %v\",\n\t\t\t\tsecretsErr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\tgcpAdminSa := fmt.Sprintf(\"%v-admin@%v.iam.gserviceaccount.com\", gcp.kfDef.Name, gcp.kfDef.Spec.Project)\n\tgcpUserSa := fmt.Sprintf(\"%v-user@%v.iam.gserviceaccount.com\", gcp.kfDef.Name, gcp.kfDef.Spec.Project)\n\tif err = gcp.allowAdmineditUserSA(gcpAdminSa, gcpUserSa); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Fail to setup workload identity:: %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\t// Create the role binding for k8s service account\n\tkubeflowWorkloadIdentityMapping := map[string]string{\n\t\t\"kf-admin\": gcpAdminSa,\n\t\t\"kf-user\":  gcpUserSa,\n\t}\n\tif err = gcp.setupWorkloadIdentity(gcp.kfDef.Namespace, kubeflowWorkloadIdentityMapping); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Fail to setup workload identity:: %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\tistioWorkloadIdentityMapping := map[string]string{\n\t\t\"kf-admin\": gcpAdminSa,\n\t}\n\tif err = gcp.setupWorkloadIdentity(gcp.getIstioNamespace(), istioWorkloadIdentityMapping); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Fail to setup workload identity:: %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Try to get information for the deployment. If returned, delete it.\nfunc deleteDeployment(deploymentmanagerService *deploymentmanager.Service, ctx context.Context,\n\tproject string, name string) error {\n\t_, err := deploymentmanagerService.Deployments.Get(project, name).Context(ctx).Do()\n\tif err != nil {\n\t\te := err.(*googleapi.Error)\n\t\tif e.Code == 404 {\n\t\t\t// Don't treat not found deployment deletion as error to make kfctl delete idempotent.\n\t\t\tlog.Infof(\"Deployment %v/%v is not found during deletion.\", project, name)\n\t\t\treturn nil\n\t\t} else {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"Deployment %v/%v has unexpected error: %v\",\n\t\t\t\t\tproject, name, err),\n\t\t\t}\n\t\t}\n\t}\n\n\top, err := deploymentmanagerService.Deployments.Delete(project, name).Context(ctx).Do()\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Gcp.Delete is failed for %v/%v: %v\",\n\t\t\t\tproject, name, err),\n\t\t}\n\t}\n\tdeleteEntry := []*dmOperationEntry{&dmOperationEntry{\n\t\toperationName: op.Name,\n\t\taction:        \"Deleting \" + name,\n\t}}\n\tif err = blockingWait(project, deploymentmanagerService, deleteEntry); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Gcp.Delete is failed for %v/%v: %v\",\n\t\t\t\tproject, name, err.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\treturn nil\n}\n\n// Delete endpoint service from resources.\nfunc (gcp *Gcp) deleteEndpoints(ctx context.Context) error {\n\tservicemanagementService, err := servicemanagement.New(gcp.client)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"creating servicemanagement API client error: %v\", err),\n\t\t}\n\t}\n\n\tlog.Infof(\"Deleting endpoint: %v\", gcp.kfDef.Spec.Hostname)\n\tservices := servicemanagement.NewServicesService(servicemanagementService)\n\top, deleteErr := services.Delete(gcp.kfDef.Spec.Hostname).Context(ctx).Do()\n\tif deleteErr != nil {\n\t\tlog.Warningf(\"Endpoint deletion error: %v\", deleteErr)\n\t\tnextPage := \"\"\n\t\t// Use a loop to read multi-page managed services list.\n\t\tfor {\n\t\t\tlog.Info(\"Checking all endpoints...\")\n\t\t\tlist := services.List().ProducerProjectId(gcp.kfDef.Spec.Project)\n\t\t\tif nextPage != \"\" {\n\t\t\t\tlist = list.PageToken(nextPage)\n\t\t\t}\n\t\t\tlistResp, err := list.Do()\n\t\t\tif err != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"listing managed services error: %v\", err),\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, s := range listResp.Services {\n\t\t\t\tif s.ServiceName == gcp.kfDef.Spec.Hostname {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"issuing endpoint deletion error: %v\", deleteErr),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Explicitly copy it to prevent memory leak.\n\t\t\tnextPage = \"\" + listResp.NextPageToken\n\t\t\tif nextPage == \"\" {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// Delete is not successful and we are not able to find endpoint in managed\n\t\t// services, treat it as OK.\n\t\tlog.Infof(\"Endpoint %v deletion is failed but it is not found in managed services, treating it as successful.\", gcp.kfDef.Spec.Hostname)\n\t\treturn nil\n\t}\n\n\topService := servicemanagement.NewOperationsService(servicemanagementService)\n\topName := \"\" + op.Name\n\treturn backoff.Retry(func() error {\n\t\tnewOp, retryErr := opService.Get(opName).Context(ctx).Do()\n\t\tif retryErr != nil {\n\t\t\tlog.Errorf(\"Long running endpoint deletion error: %v\", retryErr)\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"long running endpoint deletion error: %v\", retryErr),\n\t\t\t}\n\t\t}\n\t\tif newOp.Error != nil {\n\t\t\treturn backoff.Permanent(&kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"long running endpoint deletion error: %v\", newOp.Error.Message),\n\t\t\t})\n\t\t}\n\t\tif newOp.Done {\n\t\t\tif newOp.HTTPStatusCode != 200 {\n\t\t\t\treturn backoff.Permanent(&kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"Abnormal response code: %v\", newOp.HTTPStatusCode),\n\t\t\t\t})\n\t\t\t}\n\t\t\tlog.Infof(\"Endpoint deletion %v is completed: %v\", gcp.kfDef.Spec.Hostname, string(newOp.Response))\n\t\t\treturn nil\n\t\t}\n\t\tlog.Infof(\"Endpoint deletion is running: %v (op = %v)\", gcp.kfDef.Spec.Hostname, newOp.Name)\n\t\topName = newOp.Name\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Endpoint deletion is running...\"),\n\t\t}\n\t}, newDefaultBackoff())\n}\n\nfunc (gcp *Gcp) Delete(resources kftypesv3.ResourceEnum) error {\n\tif err := gcp.initGcpClient(); err != nil {\n\t\tlog.Errorf(\"There was a problem initializing the GCP client; %v\", err)\n\t\treturn errors.WithMessagef(err, \"Gcp.gcpInitProject Could not initatie a GCP client\")\n\t}\n\tctx := context.Background()\n\tdeploymentmanagerService, err := deploymentmanager.New(gcp.client)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error creating deploymentmanagerService: %v\", err),\n\t\t}\n\t}\n\n\t// cluster and storage deployments are required to be deleted. network and gcfs deployments are optional.\n\tproject := gcp.kfDef.Spec.Project\n\tdeletingDeployments := []string{\n\t\tgcp.kfDef.Name,\n\t}\n\tif gcp.kfDef.Spec.DeleteStorage {\n\t\tdeletingDeployments = append(deletingDeployments, gcp.kfDef.Name+\"-storage\")\n\t}\n\tif _, networkStatErr := os.Stat(path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG, NETWORK_FILE)); !os.IsNotExist(networkStatErr) {\n\t\tdeletingDeployments = append(deletingDeployments, gcp.kfDef.Name+\"-network\")\n\t}\n\tif _, gcfsStatErr := os.Stat(path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG, GCFS_FILE)); !os.IsNotExist(gcfsStatErr) {\n\t\tdeletingDeployments = append(deletingDeployments, gcp.kfDef.Name+\"-gcfs\")\n\t}\n\n\tfor _, d := range deletingDeployments {\n\t\tif err = deleteDeployment(deploymentmanagerService, ctx, project, d); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tpolicy, err := utils.GetIamPolicy(project, gcp.client)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Error when getting IAM policy: %v\", err.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\tsaSet := mapset.NewSet(\n\t\t\"serviceAccount:\"+getSA(gcp.kfDef.Name, \"admin\", project),\n\t\t\"serviceAccount:\"+getSA(gcp.kfDef.Name, \"user\", project),\n\t\t\"serviceAccount:\"+getSA(gcp.kfDef.Name, \"vm\", project))\n\tfor idx, binding := range policy.Bindings {\n\t\tcleanedMembers := []string{}\n\t\tfor _, member := range binding.Members {\n\t\t\tif saSet.Contains(member) {\n\t\t\t\tlog.Infof(\"Removing %v from %v\", member, binding.Role)\n\t\t\t} else {\n\t\t\t\tcleanedMembers = append(cleanedMembers, member)\n\t\t\t}\n\t\t}\n\t\tpolicy.Bindings[idx].Members = cleanedMembers\n\t}\n\tif err = utils.SetIamPolicy(project, policy, gcp.client); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Error when cleaning IAM policy: %v\", err.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\tif err = gcp.deleteEndpoints(ctx); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (gcp *Gcp) Dump(resources kftypesv3.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (gcp *Gcp) copyFile(source string, dest string) error {\n\tfrom, err := os.Open(source)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot open input for copying: %v\", err),\n\t\t}\n\t}\n\tdefer from.Close()\n\tto, err := os.OpenFile(dest, os.O_RDWR|os.O_CREATE, 0666)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot create dest file %v : %v\", dest, err),\n\t\t}\n\t}\n\tdefer to.Close()\n\t_, err = io.Copy(to, from)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"copy failed source %v dest %v: %v\", source, dest, err),\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Helper function to generate account field.\nfunc (gcp *Gcp) getAccount() string {\n\tiapAcct := \"serviceAccount:\" + gcp.kfDef.Spec.Email\n\tif !strings.Contains(gcp.kfDef.Spec.Email, \"gserviceaccount.com\") {\n\t\tiapAcct = \"user:\" + gcp.kfDef.Spec.Email\n\t}\n\treturn iapAcct\n}\n\n// Write IAM binding rules based on GCP app config.\nfunc (gcp *Gcp) writeIamBindingsFile(src string, dest string) error {\n\tbuf, err := ioutil.ReadFile(src)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when reading template %v: %v\", src, err),\n\t\t}\n\t}\n\n\tvar data map[string]interface{}\n\tif err = yaml.Unmarshal(buf, &data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when unmarshaling template %v: %v\", src, err),\n\t\t}\n\t}\n\n\te, ok := data[\"bindings\"]\n\tif !ok {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"Invalid IAM bindings format: not able to find `bindings` entry.\",\n\t\t}\n\t}\n\n\troles := map[string]string{\n\t\t\"set-kubeflow-admin-service-account\": \"serviceAccount:\" + getSA(gcp.kfDef.Name, \"admin\", gcp.kfDef.Spec.Project),\n\t\t\"set-kubeflow-user-service-account\":  \"serviceAccount:\" + getSA(gcp.kfDef.Name, \"user\", gcp.kfDef.Spec.Project),\n\t\t\"set-kubeflow-vm-service-account\":    \"serviceAccount:\" + getSA(gcp.kfDef.Name, \"vm\", gcp.kfDef.Spec.Project),\n\t\t\"set-kubeflow-iap-account\":           gcp.getAccount(),\n\t}\n\n\tbindings := e.([]interface{})\n\tfor idx, b := range bindings {\n\t\tbinding := b.(map[string]interface{})\n\t\tif mem, ok := binding[\"members\"]; ok {\n\t\t\tmembers := mem.([]interface{})\n\t\t\tvar newMembers []string\n\t\t\tfor _, m := range members {\n\t\t\t\tmember := m.(string)\n\t\t\t\tif acct, ok := roles[member]; ok {\n\t\t\t\t\tnewMembers = append(newMembers, acct)\n\t\t\t\t} else {\n\t\t\t\t\tnewMembers = append(newMembers, member)\n\t\t\t\t}\n\t\t\t}\n\t\t\tbinding[\"members\"] = newMembers\n\t\t\tbindings[idx] = binding\n\t\t} else {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: \"Invalid IAM bindings format: not able to find `members` entry.\",\n\t\t\t}\n\t\t}\n\t}\n\tdata[\"bindings\"] = bindings\n\n\tif buf, err = yaml.Marshal(data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when marshaling IAM bindings: %v\", err),\n\t\t}\n\t}\n\tif err = ioutil.WriteFile(dest, buf, 0644); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when writing IAM bindings: %v\", err),\n\t\t}\n\t}\n\treturn nil\n}\n\n// Replace placeholders and write to cluster-kubeflow.yaml\n//\n// TODO(jlewi): Is it possible to deserialize YAML to a partially known struct?\nfunc (gcp *Gcp) writeClusterConfig(src string, dest string, gcpPluginSpec gcpplugin.GcpPluginSpec) error {\n\tbuf, err := ioutil.ReadFile(src)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when reading template %v: %v\", src, err),\n\t\t}\n\t}\n\n\tvar data map[string]interface{}\n\tif err = yaml.Unmarshal(buf, &data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when unmarshaling template %v: %v\", src, err),\n\t\t}\n\t}\n\n\tres, ok := data[\"resources\"]\n\tif !ok {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"Invalid cluster config - not able to find resources entry.\",\n\t\t}\n\t}\n\n\tresources := res.([]interface{})\n\tfor idx, re := range resources {\n\t\tresource := re.(map[string]interface{})\n\t\tvar properties map[string]interface{}\n\t\tif props, ok := resource[\"properties\"]; ok {\n\t\t\tproperties = props.(map[string]interface{})\n\t\t} else {\n\t\t\tproperties = make(map[string]interface{})\n\t\t}\n\t\tproperties[\"gkeApiVersion\"] = kftypesv3.DefaultGkeApiVer\n\t\tproperties[\"zone\"] = gcp.kfDef.Spec.Zone\n\t\tproperties[\"users\"] = []string{\n\t\t\tgcp.getAccount(),\n\t\t}\n\t\tproperties[\"ipName\"] = gcp.kfDef.Spec.IpName\n\t\tresource[\"properties\"] = properties\n\t\tproperties[\"enable-workload-identity\"] = true\n\t\tproperties[\"identity-namespace\"] = gcp.kfDef.Spec.Project + \".svc.id.goog\"\n\t\tresources[idx] = resource\n\t}\n\tdata[\"resources\"] = resources\n\n\tif buf, err = yaml.Marshal(data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when marshaling for %v: %v\", dest, err),\n\t\t}\n\t}\n\tif err = ioutil.WriteFile(dest, buf, 0644); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when writing to %v: %v\", dest, err),\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Replace placeholders and write to storage-kubeflow.yaml\nfunc (gcp *Gcp) writeStorageConfig(src string, dest string) error {\n\tbuf, err := ioutil.ReadFile(src)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when reading storage-kubeflow template: %v\", err),\n\t\t}\n\t}\n\n\tvar data map[string]interface{}\n\tif err = yaml.Unmarshal(buf, &data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when unmarshaling template %v: %v\", src, err),\n\t\t}\n\t}\n\n\tres, ok := data[\"resources\"]\n\tif !ok {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"Invalid storage config - not able to find resources entry.\",\n\t\t}\n\t}\n\n\tresources := res.([]interface{})\n\tfor idx, re := range resources {\n\t\tresource := re.(map[string]interface{})\n\t\tvar properties map[string]interface{}\n\t\tif props, ok := resource[\"properties\"]; ok {\n\t\t\tproperties = props.(map[string]interface{})\n\t\t} else {\n\t\t\tproperties = make(map[string]interface{})\n\t\t}\n\t\tproperties[\"zone\"] = gcp.kfDef.Spec.Zone\n\t\tproperties[\"createPipelinePersistentStorage\"] = true\n\t\tresource[\"properties\"] = properties\n\t\tresources[idx] = resource\n\t}\n\tdata[\"resources\"] = resources\n\n\tif buf, err = yaml.Marshal(data); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when marshaling for %v: %v\", dest, err),\n\t\t}\n\t}\n\tif err = ioutil.WriteFile(dest, buf, 0644); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Error when writing to %v: %v\", dest, err),\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (gcp *Gcp) generateDMConfigs() error {\n\tpluginSpec, err := gcp.GetPluginSpec()\n\n\tif err != nil {\n\t\treturn nil\n\t}\n\t// Skip DM config build if not specified in kfdef\n\tif pluginSpec.DeploymentManagerConfig == nil {\n\t\treturn nil\n\t}\n\n\tappDir := gcp.kfDef.Spec.AppDir\n\tgcpConfigDir := path.Join(appDir, GCP_CONFIG)\n\tgcpConfigDirErr := os.MkdirAll(gcpConfigDir, os.ModePerm)\n\tif gcpConfigDirErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot create directory %v using appdir %v\",\n\t\t\t\tgcpConfigDirErr, appDir),\n\t\t}\n\t}\n\trepo, foundRepo := gcp.kfDef.GetRepoCache(pluginSpec.DeploymentManagerConfig.RepoRef.Name)\n\n\tif !foundRepo {\n\t\terr := fmt.Errorf(\"Repo %v not found in KfDef.Status.Caches\", pluginSpec.DeploymentManagerConfig.RepoRef.Name)\n\t\tlog.Errorf(\"%v\", err)\n\t\treturn errors.WithStack(err)\n\t}\n\n\tsourceDir := path.Join(repo.LocalPath, pluginSpec.DeploymentManagerConfig.RepoRef.Path)\n\tfiles := []string{\"cluster.jinja\", \"cluster.jinja.schema\", \"storage.jinja\",\n\t\t\"storage.jinja.schema\"}\n\tfor _, file := range files {\n\t\tsourceFile := filepath.Join(sourceDir, file)\n\t\tdestFile := filepath.Join(gcpConfigDir, file)\n\t\tcopyErr := gcp.copyFile(sourceFile, destFile)\n\t\tif copyErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: copyErr.(*kfapis.KfError).Code,\n\t\t\t\tMessage: fmt.Sprintf(\"could not copy %v to %v using repo local path %v: %v\",\n\t\t\t\t\tsourceFile, destFile, repo.LocalPath, copyErr.(*kfapis.KfError).Message),\n\t\t\t}\n\t\t}\n\t}\n\n\t// Reading from templates and write to gcp_config directory with content had placeholders\n\t// replaced.\n\tfrom := filepath.Join(sourceDir, \"iam_bindings_template.yaml\")\n\tto := filepath.Join(gcpConfigDir, \"iam_bindings.yaml\")\n\tif err := gcp.writeIamBindingsFile(from, to); err != nil {\n\t\treturn err\n\t}\n\tfrom = filepath.Join(sourceDir, CONFIG_FILE)\n\tto = filepath.Join(gcpConfigDir, CONFIG_FILE)\n\tif err := gcp.writeClusterConfig(from, to, *pluginSpec); err != nil {\n\t\treturn err\n\t}\n\tif pluginSpec.GetCreatePipelinePersistentStorage() {\n\t\tlog.Infof(\"Configuring pipelines persistent storage\")\n\t\tfrom = filepath.Join(sourceDir, STORAGE_FILE)\n\t\tto = filepath.Join(gcpConfigDir, STORAGE_FILE)\n\t\tif err := gcp.writeStorageConfig(from, to); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// createOrUpdateSecret creates or updates the existing secret.\nfunc createOrUpdateSecret(client *clientset.Clientset, secret *v1.Secret) error {\n\t// Try creating the secret\n\t_, err := client.CoreV1().Secrets(secret.Namespace).Create(secret)\n\n\tif err != nil {\n\t\tif k8serrors.IsAlreadyExists(err) {\n\t\t\t_, err = client.CoreV1().Secrets(secret.Namespace).Update(secret)\n\n\t\t\tif err != nil {\n\t\t\t\tlog.Errorf(\"Error trying to update secret %v.%v; error %v\", secret.Namespace, secret.Name, err)\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: err.Error(),\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlog.Errorf(\"Error trying to create secret %v.%v; error %v\", secret.Namespace, secret.Name, err)\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: err.Error(),\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// TODO(jlewi): We should replace all calls to this method with createOrUpdateSecret\nfunc insertSecret(client *clientset.Clientset, secretName string, namespace string, data map[string][]byte) error {\n\tsecret := &v1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      secretName,\n\t\t\tNamespace: namespace,\n\t\t},\n\t\tData: data,\n\t}\n\t_, err := client.CoreV1().Secrets(namespace).Create(secret)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\tif k8serrors.IsAlreadyExists(err) {\n\t\t\tlog.Infof(\"Secret %v.%v already exists\", namespace, secretName)\n\t\t\treturn nil\n\t\t}\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\n// Create key for service account and write to GCP as secret.\nfunc (gcp *Gcp) createGcpServiceAcctSecret(ctx context.Context, client *clientset.Clientset,\n\temail string, secretName string, namespace string) error {\n\t_, err := client.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{})\n\tif err == nil {\n\t\tlog.Infof(\"Secret for %v already exists ...\", secretName)\n\t\treturn nil\n\t}\n\n\tlog.Infof(\"Secret for %v not found, creating ...\", secretName)\n\toClient := oauth2.NewClient(ctx, gcp.tokenSource)\n\tiamService, err := iam.New(oClient)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Get Oauth Client error: %v\", err),\n\t\t}\n\t}\n\tname := fmt.Sprintf(\"projects/%v/serviceAccounts/%v\", gcp.kfDef.Spec.Project,\n\t\temail)\n\treq := &iam.CreateServiceAccountKeyRequest{\n\t\tKeyAlgorithm:   \"KEY_ALG_RSA_2048\",\n\t\tPrivateKeyType: \"TYPE_GOOGLE_CREDENTIALS_FILE\",\n\t}\n\tsaKey, err := iamService.Projects.ServiceAccounts.Keys.Create(name, req).Context(ctx).Do()\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Service account key creation error: %v\", err),\n\t\t}\n\t}\n\tprivateKeyData, err := base64.StdEncoding.DecodeString(saKey.PrivateKeyData)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"PrivateKeyData decoding error: %v\", err),\n\t\t}\n\t}\n\treturn insertSecret(client, secretName, namespace, map[string][]byte{\n\t\tsecretName + \".json\": privateKeyData,\n\t})\n}\n\n// User CLIENT_ID and CLIENT_SECRET from GCP to create a secret for IAP.\nfunc (gcp *Gcp) createIapSecret(ctx context.Context, client *clientset.Clientset) error {\n\tp, err := gcp.GetPluginSpec()\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif p.Auth == nil {\n\t\treturn errors.WithStack(fmt.Errorf(\"GcpPluginSpec has no Auth\"))\n\t}\n\n\tif p.Auth.IAP == nil {\n\t\treturn errors.WithStack(fmt.Errorf(\"GcpPluginSpec has no Auth.IAP\"))\n\t}\n\n\toauthSecretNamespace := gcp.getIstioNamespace()\n\tlog.Infof(\"OAuthSecretNS: %v\", oauthSecretNamespace)\n\n\tif _, err := client.CoreV1().Secrets(oauthSecretNamespace).\n\t\tGet(KUBEFLOW_OAUTH, metav1.GetOptions{}); err == nil {\n\t\tlog.Infof(\"Secret for %v already exits ...\", KUBEFLOW_OAUTH)\n\t\treturn nil\n\t}\n\n\toauthSecret, err := gcp.kfDef.GetSecret(p.Auth.IAP.OAuthClientSecret.Name)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not read IAP OAuth ClientSecret from KfDef; error %v\", err)\n\t\treturn err\n\t}\n\n\tsecret := &v1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      KUBEFLOW_OAUTH,\n\t\t\tNamespace: oauthSecretNamespace,\n\t\t},\n\t\tData: map[string][]byte{\n\t\t\tstrings.ToLower(CLIENT_ID):     []byte(p.Auth.IAP.OAuthClientId),\n\t\t\tstrings.ToLower(CLIENT_SECRET): []byte(oauthSecret),\n\t\t},\n\t}\n\treturn createOrUpdateSecret(client, secret)\n}\n\nfunc base64EncryptPassword(password string) (string, error) {\n\tpasswordHash, err := bcrypt.GenerateFromPassword([]byte(password), 10)\n\tif err != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error when hashing password: %v\", err),\n\t\t}\n\t}\n\tencodedPassword := base64.StdEncoding.EncodeToString(passwordHash)\n\n\treturn encodedPassword, nil\n}\n\n// TODO(jlewi): Add a unittest to this function.\nfunc (gcp *Gcp) buildBasicAuthSecret() (*v1.Secret, error) {\n\tp, err := gcp.GetPluginSpec()\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif p.Auth == nil || p.Auth.BasicAuth == nil || p.Auth.BasicAuth.Password.Name == \"\" {\n\t\terr := errors.WithStack(fmt.Errorf(\"BasicAuth.Password.Name must be set\"))\n\t\tlog.Errorf(\"%v\", err)\n\t\treturn nil, err\n\t}\n\n\tpassword, err := gcp.kfDef.GetSecret(p.Auth.BasicAuth.Password.Name)\n\tif err != nil {\n\t\tlog.Errorf(\"There was a problem getting the password for basic auth; error %v\", err)\n\t\treturn nil, err\n\t}\n\tss, err := gcp.kfDef.GetSecretSource(p.Auth.BasicAuth.Password.Name)\n\tif err != nil {\n\t\tlog.Errorf(\"There was a problem getting the password for basic auth; error %v\", err)\n\t\treturn nil, err\n\t}\n\t// For backward compatibility, we encode passward that is not hashed.\n\tvar encodedPassword string\n\tif ss.HashedSource != nil {\n\t\tencodedPassword = password\n\t} else {\n\t\tencodedPassword, err = base64EncryptPassword(password)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"There was a problem encrypting the password; %v\", err)\n\t\t\treturn nil, errors.WithStack(err)\n\t\t}\n\t}\n\n\tsecret := &v1.Secret{\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:      BASIC_AUTH_SECRET,\n\t\t\tNamespace: gcp.kfDef.Namespace,\n\t\t},\n\t\tData: map[string][]byte{\n\t\t\t\"username\":     []byte(p.Auth.BasicAuth.Username),\n\t\t\t\"passwordhash\": []byte(encodedPassword),\n\t\t},\n\t}\n\n\treturn secret, nil\n}\n\n// createBasicAuthSecret creates a secret containing basic auth information.\nfunc (gcp *Gcp) createBasicAuthSecret(client *clientset.Clientset) error {\n\tsecret, err := gcp.buildBasicAuthSecret()\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn createOrUpdateSecret(client, secret)\n}\n\nfunc (gcp *Gcp) getIstioNamespace() string {\n\tif gcp.kfDef.UsingStacks() {\n\t\t// TODO(jlewi): With stacks we currently assume the iap-ingress is installed in istio-namespace.\n\t\t// The namespace would now be set inside the kustomization.yaml file of the package. So if needed we\n\t\t// could read the value from there.\n\t\tlog.Warnf(\"Assuming iap-ingress is installed in namespace: %v\", DefaultIstioNamespace)\n\t\treturn DefaultIstioNamespace\n\t}\n\tif ingressNamespace, ok := gcp.kfDef.GetApplicationParameter(\"iap-ingress\", \"namespace\"); ok {\n\t\treturn ingressNamespace\n\t}\n\tif ingressNamespace, ok := gcp.kfDef.GetApplicationParameter(\"basic-auth-ingress\", \"namespace\"); ok {\n\t\treturn ingressNamespace\n\t}\n\treturn gcp.kfDef.Namespace\n}\n\nfunc (gcp *Gcp) createSecrets() error {\n\tctx := context.Background()\n\n\tk8sClient, err := gcp.getK8sClientset(ctx)\n\tif err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, \"set K8s clientset error\")\n\t}\n\tlog.Infof(\"Creating GCP secrets...\")\n\t// Always create secrets in kubeflow namespace for backward compatiblility.\n\tadminEmail := getSA(gcp.kfDef.Name, \"admin\", gcp.kfDef.Spec.Project)\n\tuserEmail := getSA(gcp.kfDef.Name, \"user\", gcp.kfDef.Spec.Project)\n\tif err := gcp.createGcpServiceAcctSecret(ctx, k8sClient, adminEmail, ADMIN_SECRET_NAME, gcp.kfDef.Namespace); err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"cannot create admin secret %v\", ADMIN_SECRET_NAME))\n\t}\n\tif err := gcp.createGcpServiceAcctSecret(ctx, k8sClient, userEmail, USER_SECRET_NAME, gcp.kfDef.Namespace); err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"cannot create user secret %v\", USER_SECRET_NAME))\n\t}\n\tif gcp.kfDef.Spec.UseBasicAuth {\n\t\tlog.Infof(\"Creating GCP secrets for basic auth...\")\n\t\tif err := gcp.createBasicAuthSecret(k8sClient); err != nil {\n\t\t\treturn kfapis.NewKfErrorWithMessage(err, \"cannot create basic auth login secret\")\n\t\t}\n\t} else {\n\t\tlog.Infof(\"Creating GCP secrets for IAP...\")\n\t\tif err := gcp.createIapSecret(ctx, k8sClient); err != nil {\n\t\t\treturn kfapis.NewKfErrorWithMessage(err, \"cannot create IAP auth secret\")\n\t\t}\n\t}\n\treturn nil\n}\n\n// setupWorkloadIdentity creates the k8s service accounts and IAM bindings for them. k8sToGcpSA: k8sServiceAccounts to gcpServiceAccounts mapping\nfunc (gcp *Gcp) allowAdmineditUserSA(gcpAdminSa string, gcpUserSa string) error {\n\tctx := context.Background()\n\toClient := oauth2.NewClient(ctx, gcp.tokenSource)\n\tiamService, err := iam.New(oClient)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Get Oauth Client error: %v\", err),\n\t\t}\n\t}\n\tlog.Infof(\"Make admin account %v the owner of user account %v\", gcpAdminSa, gcpUserSa)\n\tpolicy, err := utils.GetServiceAccountIamPolicy(iamService, gcp.kfDef.Spec.Project, gcpUserSa)\n\tif err != nil {\n\t\treturn err\n\t}\n\tnewBinding := iam.Binding{}\n\tnewBinding.Role = \"roles/owner\"\n\tnewBinding.Members = []string{\n\t\tfmt.Sprintf(\"serviceAccount:%v\", gcpAdminSa),\n\t}\n\tpolicy.Bindings = append(policy.Bindings, &newBinding)\n\tlog.Infof(\"New policy: %v\", *policy)\n\n\terr = utils.SetServiceAccountIamPolicy(iamService, policy, gcp.kfDef.Spec.Project, gcpUserSa)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// setupWorkloadIdentity creates the k8s service accounts and IAM bindings for them. k8sToGcpSA: k8sServiceAccounts to gcpServiceAccounts mapping\nfunc (gcp *Gcp) setupWorkloadIdentity(namespace string, k8sSa2gcpSa map[string]string) error {\n\tctx := context.Background()\n\tk8sClient, err := gcp.getK8sClientset(ctx)\n\tif err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, \"Get K8s clientset error\")\n\t}\n\n\toClient := oauth2.NewClient(ctx, gcp.tokenSource)\n\tiamService, err := iam.New(oClient)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Get Oauth Client error: %v\", err),\n\t\t}\n\t}\n\n\tfor k8sSa, gcpSa := range k8sSa2gcpSa {\n\t\tcreateOrUpdateK8sServiceAccount(k8sClient, namespace, k8sSa, gcpSa)\n\t\t// Create IAM bindings under each GCP service account (different from IAM bindings for projects)\n\t\t// Could we combine the updates into a single set of Get/Set requests?\n\t\t// Can we also refactor the code so that we have a separate functions that generate the modified policy but don't apply it and then write a unittest that the modified policy is correct?\n\t\tlog.Infof(\"Setting up iam policy for serviceaccount: %v in namespace %v\", gcpSa, namespace)\n\t\tpolicy, err := utils.GetServiceAccountIamPolicy(iamService, gcp.kfDef.Spec.Project, gcpSa)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = utils.UpdateWorkloadIdentityBindingsPolicy(policy, gcp.kfDef.Spec.Project, namespace, k8sSa)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlog.Infof(\"New policy: %v\", *policy)\n\t\terr = utils.SetServiceAccountIamPolicy(iamService, policy, gcp.kfDef.Spec.Project, gcpSa)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// createOrUpdateK8sServiceAccount creates or updates k8s service account with annotation\n// iam.gke.io/gcp-service-account=gsa\n// TODO(lunkai): Ideally the k8s service account should be specified by kustomize.\nfunc createOrUpdateK8sServiceAccount(k8sClientset *clientset.Clientset, namespace string, name string, gsa string) error {\n\tlog.Infof(\"Creating service account %v in namespace %v\", name, namespace)\n\tcurrSA, err := k8sClientset.CoreV1().ServiceAccounts(namespace).Get(name, metav1.GetOptions{})\n\tif err == nil {\n\t\tlog.Infof(\"Service account already exists...\")\n\t\tif currSA.Annotations == nil {\n\t\t\tcurrSA.Annotations = map[string]string{}\n\t\t}\n\t\tcurrSA.Annotations[\"iam.gke.io/gcp-service-account\"] = gsa\n\t\t_, err = k8sClientset.CoreV1().ServiceAccounts(namespace).Update(currSA)\n\t\tif err != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: err.Error(),\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\tlog.Infof(\"Get service account error: %v\", err)\n\t_, err = k8sClientset.CoreV1().ServiceAccounts(namespace).Create(\n\t\t&v1.ServiceAccount{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName:      name,\n\t\t\t\tNamespace: namespace,\n\t\t\t\tAnnotations: map[string]string{\n\t\t\t\t\t\"iam.gke.io/gcp-service-account\": gsa,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\n// SetupWorkloadIdentityPermission bind gcp admin service account to owner of gcp \"user\" service account, so controller can edit WorkloadIdentity\nfunc (gcp *Gcp) SetupWorkloadIdentityPermission() error {\n\tkubeflowWorkloadIdentityMapping := map[string]string{\n\t\t\"profiles-controller-service-account\": fmt.Sprintf(\"%v-admin@%v.iam.gserviceaccount.com\", gcp.kfDef.Name, gcp.kfDef.Spec.Project),\n\t}\n\tif err := gcp.setupWorkloadIdentity(gcp.kfDef.Namespace, kubeflowWorkloadIdentityMapping); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode: err.(*kfapis.KfError).Code,\n\t\t\tMessage: fmt.Sprintf(\"Fail to setup workload identity:: %v\",\n\t\t\t\terr.(*kfapis.KfError).Message),\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc generatePodDefault(group string, version string, kind string, namespace string) *unstructured.Unstructured {\n\tlog.Infof(\"Generating %v in namespace %v; APIVersion %v/%v\", kind, namespace, group, version)\n\n\t// TODO(gabrielwen): Clean up after v2 dependencies are fixed.\n\t// https://github.com/kubeflow/kubeflow/issues/3713\n\tunstructuredContent := map[string]interface{}{\n\t\t\"apiVersion\": group + \"/\" + version,\n\t\t\"kind\":       kind,\n\t\t\"metadata\": map[string]interface{}{\n\t\t\t\"name\":      PodDefaultName,\n\t\t\t\"namespace\": namespace,\n\t\t},\n\t\t\"spec\": map[string]interface{}{\n\t\t\t\"selector\": map[string]interface{}{\n\t\t\t\t\"matchLabels\": map[string]interface{}{\n\t\t\t\t\t\"add-gcp-secret\": \"true\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"desc\": \"add gcp credential\",\n\t\t\t\"env\": []interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"name\":  \"GOOGLE_APPLICATION_CREDENTIALS\",\n\t\t\t\t\t\"value\": \"/secret/gcp/user-gcp-sa.json\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"volumeMounts\": []interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"name\":      \"secret-volume\",\n\t\t\t\t\t\"mountPath\": \"/secret/gcp\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"volumes\": []interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"name\": \"secret-volume\",\n\t\t\t\t\t\"secret\": map[string]interface{}{\n\t\t\t\t\t\t\"secretName\": USER_SECRET_NAME,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tpodDefault := &unstructured.Unstructured{\n\t\tObject: unstructuredContent,\n\t}\n\treturn podDefault\n}\n\n// Configure PodDefault to add secret.\nfunc (gcp *Gcp) ConfigPodDefault() error {\n\tif gcp.kfDef.Spec.Email == \"\" {\n\t\treturn nil\n\t}\n\n\tctx := context.Background()\n\tk8sClient, err := gcp.getK8sClientset(ctx)\n\tif err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, \"set K8s clientset error\")\n\t}\n\n\tdefaultNamespace := kftypesv3.EmailToDefaultName(gcp.kfDef.Spec.Email)\n\t_, err = k8sClient.CoreV1().Namespaces().Get(defaultNamespace, metav1.GetOptions{})\n\tif err != nil {\n\t\tlog.Warnf(\"Default namespace %v creation skipped\", defaultNamespace)\n\t\treturn nil\n\t}\n\tlog.Infof(\"Downloading secret %v from namespace %v\", USER_SECRET_NAME, gcp.kfDef.Namespace)\n\tsecret, err := k8sClient.CoreV1().Secrets(gcp.kfDef.Namespace).Get(USER_SECRET_NAME, metav1.GetOptions{})\n\tif err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, \"User service account secret is not created.\")\n\t}\n\tlog.Infof(\"Creating secret %v to namespace %v\", USER_SECRET_NAME, defaultNamespace)\n\tif err = insertSecret(k8sClient, USER_SECRET_NAME, defaultNamespace, secret.Data); err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, fmt.Sprintf(\"cannot create secret %v in namespace %v\", USER_SECRET_NAME, defaultNamespace))\n\t}\n\n\tgroup := \"kubeflow.org\"\n\tversion := \"v1alpha1\"\n\tkind := \"PodDefault\"\n\tpodDefault := generatePodDefault(group, version, kind, defaultNamespace)\n\tcluster, err := utils.GetClusterInfo(ctx, gcp.kfDef.Spec.Project,\n\t\tgcp.kfDef.Spec.Zone, gcp.kfDef.Name, gcp.tokenSource)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"get Cluster error: %v\", err),\n\t\t}\n\t}\n\tbody, err := podDefault.MarshalJSON()\n\tif err != nil {\n\t\treturn kfapis.NewKfErrorWithMessage(err, \"Marshal error for PodDefault config.\")\n\t}\n\n\t// Need to re-configure restful client to remap group/kind/version.\n\tconfig, err := utils.BuildConfigFromClusterInfo(ctx, cluster, gcp.tokenSource)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"build ClientConfig error: %v\", err),\n\t\t}\n\t}\n\t_discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"build DiscoveryClient error: %v\", err),\n\t\t}\n\t}\n\t_cached := memory.NewMemCacheClient(_discoveryClient)\n\t_cached.Invalidate()\n\tmapper := restmapper.NewDeferredDiscoveryRESTMapper(_cached)\n\tgk := schema.GroupKind{\n\t\tGroup: group,\n\t\tKind:  kind,\n\t}\n\tmapping, err := mapper.RESTMapping(gk, version)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"config Group/Version/Kind error: %v\", err),\n\t\t}\n\t}\n\tc := restv2.CopyConfig(config)\n\tc.GroupVersion = &schema.GroupVersion{\n\t\tGroup:   group,\n\t\tVersion: version,\n\t}\n\tc.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}\n\tc.APIPath = \"/apis\"\n\tcrdClient, err := restv2.RESTClientFor(c)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"config RestClient error: %v\", err),\n\t\t}\n\t}\n\n\tgetReq := crdClient.Get().Resource(mapping.Resource.Resource).Namespace(defaultNamespace).Name(PodDefaultName)\n\tif err := getReq.Do().Error(); err == nil {\n\t\t// pod default already exists.\n\t\treturn nil\n\t}\n\n\treq := crdClient.Post().Resource(mapping.Resource.Resource).Body(body)\n\treq = req.Namespace(defaultNamespace)\n\tresult := req.Do()\n\n\treturn result.Error()\n}\n\n// setGcpPluginDefaults sets the GcpPlugin defaults.\nfunc (gcp *Gcp) setGcpPluginDefaults() error {\n\t// Set the defaults that will be used if not explicitly set.\n\t// If the plugin is provided these values will be overwritten,\n\tpluginSpec := &gcpplugin.GcpPluginSpec{}\n\terr := gcp.kfDef.GetPluginSpec(GcpPluginName, pluginSpec)\n\n\tif err != nil && !kfapis.IsNotFound(err) {\n\t\tlog.Errorf(\"There was a problem getting the gcp plugin %v\", err)\n\t\treturn errors.WithStack(err)\n\t}\n\n\tif pluginSpec.CreatePipelinePersistentStorage == nil {\n\t\tpluginSpec.CreatePipelinePersistentStorage = proto.Bool(pluginSpec.GetCreatePipelinePersistentStorage())\n\t\tlog.Infof(\"CreatePipelinePersistentStorage not set defaulting to %v\", *pluginSpec.CreatePipelinePersistentStorage)\n\t}\n\n\tif pluginSpec.EnableWorkloadIdentity == nil {\n\t\tpluginSpec.EnableWorkloadIdentity = proto.Bool(pluginSpec.GetEnableWorkloadIdentity())\n\t\tlog.Infof(\"EnableWorkloadIdentity not set defaulting to %v\", *pluginSpec.EnableWorkloadIdentity)\n\t}\n\n\tif pluginSpec.Auth == nil {\n\t\tpluginSpec.Auth = &gcpplugin.Auth{}\n\t}\n\n\tif pluginSpec.Auth.BasicAuth == nil && pluginSpec.Auth.IAP == nil {\n\t\tlog.Warnf(\"Backfilling auth; this is deprecated; Auth should be explicitly set in Gcp plugin\")\n\n\t\tif gcp.kfDef.Spec.UseBasicAuth {\n\t\t\tpluginSpec.Auth.BasicAuth = &gcpplugin.BasicAuth{}\n\t\t\tpluginSpec.Auth.BasicAuth.Username = os.Getenv(kftypesv3.KUBEFLOW_USERNAME)\n\n\t\t\tif pluginSpec.Auth.BasicAuth.Username == \"\" {\n\t\t\t\tlog.Errorf(\"Could not configure basic auth; environment variable %s not set\", kftypesv3.KUBEFLOW_USERNAME)\n\t\t\t\treturn errors.WithStack(fmt.Errorf(\"Could not configure basic auth; environment variable %s not set\", kftypesv3.KUBEFLOW_USERNAME))\n\t\t\t}\n\n\t\t\tpluginSpec.Auth.BasicAuth.Password = &kfconfig.SecretRef{\n\t\t\t\tName: BasicAuthPasswordSecretName,\n\t\t\t}\n\n\t\t\tpassword := os.Getenv(kftypesv3.KUBEFLOW_PASSWORD)\n\t\t\tif password == \"\" {\n\t\t\t\tlog.Errorf(\"Could not configure basic auth; environment variable %s not set\", kftypesv3.KUBEFLOW_PASSWORD)\n\t\t\t\treturn errors.WithStack(fmt.Errorf(\"Could not configure basic auth; environment variable %s not set\", kftypesv3.KUBEFLOW_PASSWORD))\n\t\t\t}\n\t\t\tgcp.kfDef.SetSecret(kfconfig.Secret{\n\t\t\t\tName: BasicAuthPasswordSecretName,\n\t\t\t\tSecretSource: &kfconfig.SecretSource{\n\t\t\t\t\tEnvSource: &kfconfig.EnvSource{\n\t\t\t\t\t\tName: kftypesv3.KUBEFLOW_PASSWORD,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t} else {\n\t\t\tpluginSpec.Auth.IAP = &gcpplugin.IAP{}\n\n\t\t\tpluginSpec.Auth.IAP.OAuthClientId = os.Getenv(CLIENT_ID)\n\n\t\t\tif pluginSpec.Auth.IAP.OAuthClientId == \"\" {\n\t\t\t\tlog.Errorf(\"Could not configure IAP auth; environment variable %s not set\", CLIENT_ID)\n\t\t\t\treturn errors.WithStack(fmt.Errorf(\"Could not configure IAP auth; environment variable %s not set\", CLIENT_ID))\n\t\t\t}\n\n\t\t\tpluginSpec.Auth.IAP.OAuthClientSecret = &kfconfig.SecretRef{\n\t\t\t\tName: CLIENT_SECRET,\n\t\t\t}\n\n\t\t\tgcp.kfDef.SetSecret(kfconfig.Secret{\n\t\t\t\tName: CLIENT_SECRET,\n\t\t\t\tSecretSource: &kfconfig.SecretSource{\n\t\t\t\t\tEnvSource: &kfconfig.EnvSource{\n\t\t\t\t\t\tName: CLIENT_SECRET,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\t// Set the email\n\tif gcp.kfDef.Spec.Email == \"\" && gcp.gcpAccountGetter != nil {\n\t\temail, err := gcp.gcpAccountGetter()\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Cannot get gcloud account email. Error: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\tgcp.kfDef.Spec.Email = strings.TrimSpace(email)\n\t\tpluginSpec.Email = strings.TrimSpace(email)\n\t\tlog.Infof(\"Setting Email to default: %v\", gcp.kfDef.Spec.Email)\n\t} else if gcp.kfDef.Spec.Email == \"\" {\n\t\tlog.Warnf(\"GcpAccountGetter not set; can't get default email\")\n\t}\n\t// Set the project\n\tif gcp.kfDef.Spec.Project == \"\" && gcp.gcpProjectGetter != nil {\n\t\tproject, err := gcp.gcpProjectGetter()\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Cannot get gcloud project. Error: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\tgcp.kfDef.Spec.Project = strings.TrimSpace(project)\n\t\tpluginSpec.Project = strings.TrimSpace(project)\n\t\tlog.Infof(\"Setting Project to default: %v\", gcp.kfDef.Spec.Project)\n\t} else if gcp.kfDef.Spec.Project == \"\" {\n\t\tlog.Warnf(\"GcpProjectGetter not set; can't get default project\")\n\t}\n\t// Set the zone\n\tif gcp.kfDef.Spec.Zone == \"\" && gcp.gcpZoneGetter != nil {\n\t\tzone, err := gcp.gcpZoneGetter()\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Cannot get gcloud compute/zone. Error: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\tgcp.kfDef.Spec.Zone = strings.TrimSpace(zone)\n\t\tpluginSpec.Zone = strings.TrimSpace(zone)\n\t\tlog.Infof(\"Setting Zone to default: %v\", gcp.kfDef.Spec.Zone)\n\t} else if gcp.kfDef.Spec.Zone == \"\" {\n\t\tlog.Warnf(\"GcpZoneGetter not set; can't get default zone\")\n\t}\n\n\treturn gcp.kfDef.SetPluginSpec(GcpPluginName, pluginSpec)\n}\n\n// Generate generates the gcp kfapp manifest.\n// Remind: Need to be thread-safe: this entry is share among kfctl and deploy app\nfunc (gcp *Gcp) Generate(resources kftypesv3.ResourceEnum) error {\n\tgcpDir := path.Join(gcp.kfDef.Spec.AppDir, GCP_CONFIG)\n\tif _, err := os.Stat(gcpDir); err == nil {\n\t\t// Noop if the directory already exists.\n\t\tlog.Infof(\"Folder %v exists, skip gcp.Generate\", gcpDir)\n\t\treturn nil\n\t} else if !os.IsNotExist(err) {\n\t\tlog.Errorf(\"Stat folder %v error: %v; try deleting it...\", gcpDir, err)\n\t\t_ = os.RemoveAll(gcpDir)\n\t}\n\n\tif err := gcp.kfDef.SyncCache(); err != nil {\n\t\tlog.Errorf(\"Failed to synchronize the cache; error %v\", err)\n\t\treturn errors.WithStack(err)\n\t}\n\n\tif err := gcp.setGcpPluginDefaults(); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tpluginSpec := &gcpplugin.GcpPluginSpec{}\n\terr := gcp.kfDef.GetPluginSpec(GcpPluginName, pluginSpec)\n\n\tif err != nil {\n\t\tlog.Errorf(\"Could not get GcpPluginSpec; error %v\", err)\n\t\treturn err\n\t}\n\n\t// the runGetGCPCredentials don't seem to work because those are shelled out commands\n\t// Added an alternate way to set using enironment variables\n\tif gcp.kfDef.Spec.Project == \"\" {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"GCP Project is not set, please set it in KFDef or use gcloud config set project to set a default.\",\n\t\t}\n\t}\n\tif gcp.kfDef.Spec.Email == \"\" {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"GCP account could not be determined, please set Email in KFDef or use gcloud config set account to set a default.\",\n\t\t}\n\t}\n\tif gcp.kfDef.Spec.Zone == \"\" {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"GCP Zone is not set, please set it in KFDef or use gcloud config set compute/zone to set a default.\",\n\t\t}\n\t}\n\t// Set default IPName and Hostname\n\t// This needs to happen before calling generateDM configs.\n\tif gcp.kfDef.Spec.IpName == \"\" {\n\t\tgcp.kfDef.Spec.IpName = gcp.kfDef.Name + \"-ip\"\n\t\tpluginSpec.IpName = gcp.kfDef.Spec.IpName\n\t}\n\tgcp.kfDef.Spec.Hostname = gcp.kfDef.Name + \".endpoints.\" + gcp.kfDef.Spec.Project + \".cloud.goog\"\n\tpluginSpec.Hostname = gcp.kfDef.Spec.Hostname\n\n\tswitch resources {\n\tcase kftypesv3.ALL:\n\t\tfallthrough\n\tcase kftypesv3.PLATFORM:\n\t\tgcpConfigFilesErr := gcp.generateDMConfigs()\n\t\tif gcpConfigFilesErr != nil {\n\n\t\t\tcode := http.StatusInternalServerError\n\t\t\tif v, ok := gcpConfigFilesErr.(*kfapis.KfError); ok {\n\t\t\t\tcode = v.Code\n\t\t\t}\n\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: code,\n\t\t\t\tMessage: fmt.Sprintf(\"could not generate deployment manager configs under %v Error: %v\",\n\t\t\t\t\tGCP_CONFIG, gcpConfigFilesErr),\n\t\t\t}\n\t\t}\n\t}\n\n\tif err := gcp.kfDef.SetApplicationParameter(\"profiles\", \"admin\", gcp.kfDef.Spec.Email); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\tif err := gcp.kfDef.SetApplicationParameter(\"profiles\", \"gcp-sa\", fmt.Sprintf(\n\t\t\"%v-user@%v.iam.gserviceaccount.com\", gcp.kfDef.Name, gcp.kfDef.Spec.Project)); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\tif err := gcp.kfDef.SetApplicationParameter(\"default-install\", \"user\", gcp.kfDef.Spec.Email); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\tif err := gcp.kfDef.SetApplicationParameter(\"default-install\", \"profile-name\",\n\t\tkftypesv3.EmailToDefaultName(gcp.kfDef.Spec.Email)); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tif gcp.kfDef.Spec.UseBasicAuth {\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"basic-auth-ingress\", \"ipName\", gcp.kfDef.Spec.IpName); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"basic-auth-ingress\", \"hostname\", gcp.kfDef.Spec.Hostname); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"basic-auth-ingress\", \"project\", gcp.kfDef.Spec.Project); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"istio\", \"clusterRbacConfig\", \"OFF\"); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t} else {\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"iap-ingress\", \"ipName\", gcp.kfDef.Spec.IpName); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"iap-ingress\", \"hostname\", gcp.kfDef.Spec.Hostname); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"iap-ingress\", \"project\", gcp.kfDef.Spec.Project); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\t// appName is used to give a unique name to the cloud endpoint.\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"iap-ingress\", \"appName\", gcp.kfDef.Name); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t}\n\tif *pluginSpec.CreatePipelinePersistentStorage {\n\t\tlog.Infof(\"Configuring pipeline, minio, and mysql applications\")\n\t\tminioPdName := gcp.kfDef.Name + \"-storage-artifact-store\"\n\t\tmysqlPdName := gcp.kfDef.Name + \"-storage-metadata-store\"\n\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"minio\", \"minioPd\", minioPdName); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t\tif err := gcp.kfDef.SetApplicationParameter(\"mysql\", \"mysqlPd\", mysqlPdName); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t}\n\n\t// TODO(jlewi): Why are we setting usage Id here (gcp.go) and not in kustomize.go so we do it for all platforms?\n\trand.Seed(time.Now().UnixNano())\n\tif err := gcp.kfDef.SetApplicationParameter(\"spartakus\", \"usageId\", strconv.Itoa(rand.Int())); err != nil {\n\t\tif kfconfig.IsAppNotFound(err) {\n\t\t\tlog.Infof(\"Spartakus not included; not setting usageId\")\n\t\t}\n\t}\n\n\tif err := gcp.kfDef.SetPluginSpec(GcpPluginName, pluginSpec); err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\treturn nil\n}\n\nfunc (gcp *Gcp) gcpInitProject() error {\n\tif err := gcp.initGcpClient(); err != nil {\n\t\tlog.Errorf(\"There was a problem initializing the GCP client; %v\", err)\n\t\treturn errors.WithMessagef(err, \"Gcp.gcpInitProject Could not initatie a GCP client\")\n\t}\n\n\tctx := context.Background()\n\tserviceusageService, serviceusageServiceErr := serviceusage.New(gcp.client)\n\tif serviceusageServiceErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not create service usage service %v\", serviceusageServiceErr),\n\t\t}\n\t}\n\n\tenabledApis := []string{\n\t\t\"deploymentmanager.googleapis.com\",\n\t\t\"servicemanagement.googleapis.com\",\n\t\t\"container.googleapis.com\",\n\t\t\"cloudresourcemanager.googleapis.com\",\n\t\t\"endpoints.googleapis.com\",\n\t\t\"file.googleapis.com\",\n\t\t\"ml.googleapis.com\",\n\t\t\"iam.googleapis.com\",\n\t\t\"sqladmin.googleapis.com\",\n\t}\n\top, opErr := serviceusageService.Services.BatchEnable(\"projects/\"+gcp.kfDef.Spec.Project,\n\t\t&serviceusage.BatchEnableServicesRequest{\n\t\t\tServiceIds: enabledApis,\n\t\t}).Context(ctx).Do()\n\tif opErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"issuing batch API enabling services error: %v\", opErr),\n\t\t}\n\t}\n\topService := serviceusage.NewOperationsService(serviceusageService)\n\topName := \"\" + op.Name\n\treturn backoff.Retry(func() error {\n\t\tnewOp, retryErr := opService.Get(opName).Context(ctx).Do()\n\t\tif retryErr != nil {\n\t\t\tlog.Errorf(\"Long running batch API enabling services error: %v\", retryErr)\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"long running batch API enabling services error: %v\", retryErr),\n\t\t\t}\n\t\t}\n\t\tif newOp.Error != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"long running batch API enabling services error: %v\", newOp.Error.Message),\n\t\t\t}\n\t\t}\n\t\tif newOp.Done {\n\t\t\tif newOp.HTTPStatusCode != 200 {\n\t\t\t\treturn backoff.Permanent(&kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"Abnormal response code: %v\", newOp.HTTPStatusCode),\n\t\t\t\t})\n\t\t\t}\n\t\t\tlog.Infof(\"Batch API enabling is completed: %v\", enabledApis)\n\t\t\treturn nil\n\n\t\t}\n\t\tlog.Infof(\"Batch API enabling is running: %v (op = %v)\", enabledApis, newOp.Name)\n\t\topName = \"\" + newOp.Name\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"batch API enabling is running...\"),\n\t\t}\n\t}, newDefaultBackoff())\n}\n\n// Init initializes a gcp kfapp\nfunc (gcp *Gcp) Init(resources kftypesv3.ResourceEnum) error {\n\tif !gcp.kfDef.Spec.SkipInitProject {\n\t\tlog.Infof(\"Not skipping GCP project init, running gcpInitProject.\")\n\t\tinitProjectErr := gcp.gcpInitProject()\n\t\tif initProjectErr != nil {\n\t\t\treturn initProjectErr\n\t\t}\n\t} else {\n\t\tif err := gcp.initGcpClient(); err != nil {\n\t\t\tlog.Errorf(\"There was a problem initializing the GCP client; %v\", err)\n\t\t\treturn errors.WithMessagef(err, \"Gcp.gcpInitProject Could not initatie a GCP client\")\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfapp/gcp/gcp_test.go",
    "content": "package gcp\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/gogo/protobuf/proto\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig/gcpplugin\"\n\n\t\"os\"\n\t\"reflect\"\n\t\"testing\"\n\n\tv1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\nfunc TestGcp_buildBasicAuthSecret(t *testing.T) {\n\ttype testCase struct {\n\t\tGcp           *Gcp\n\t\tGcpPluginSpec *gcpplugin.GcpPluginSpec\n\t\tExpected      *v1.Secret\n\t}\n\n\tencodedPassword, err := base64EncryptPassword(\"somepassword\")\n\n\tif err != nil {\n\t\tt.Fatalf(\"Could not encode password; %v\", err)\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tGcp: &Gcp{\n\t\t\t\tkfDef: &kfconfig.KfConfig{\n\t\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\t\tNamespace: \"gcpnamespace\",\n\t\t\t\t\t},\n\t\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\t\tPlugins: []kfconfig.Plugin{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"gcp\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tSecrets: []kfconfig.Secret{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tName: \"passwordSecret\",\n\t\t\t\t\t\t\t\tSecretSource: &kfconfig.SecretSource{\n\t\t\t\t\t\t\t\t\tLiteralSource: &kfconfig.LiteralSource{\n\t\t\t\t\t\t\t\t\t\tValue: \"somepassword\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tGcpPluginSpec: &gcpplugin.GcpPluginSpec{\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tBasicAuth: &gcpplugin.BasicAuth{\n\t\t\t\t\t\tUsername: \"kfuser\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"passwordSecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: &v1.Secret{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tName:      \"kubeflow-login\",\n\t\t\t\t\tNamespace: \"gcpnamespace\",\n\t\t\t\t},\n\t\t\t\tData: map[string][]byte{\n\t\t\t\t\t\"passwordhash\": []byte(encodedPassword),\n\t\t\t\t\t\"username\":     []byte(\"kfuser\"),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\n\t\terr := c.Gcp.kfDef.SetPluginSpec(\"KfGcpPlugin\", c.GcpPluginSpec)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not set pluginspec\")\n\t\t}\n\t\tactual, err := c.Gcp.buildBasicAuthSecret()\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get build secret; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual.TypeMeta, c.Expected.TypeMeta) {\n\t\t\tpGot, _ := Pformat(actual.TypeMeta)\n\t\t\tpWant, _ := Pformat(c.Expected.TypeMeta)\n\t\t\tt.Errorf(\"Error building secret TypeMeta got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\n\t\tfor _, k := range []string{\"username\", \"passwordHash\"} {\n\t\t\tif string(actual.Data[k]) != string(c.Expected.Data[k]) {\n\t\t\t\tpGot, _ := actual.Data[k]\n\t\t\t\tpWant, _ := c.Expected.Data[k]\n\t\t\t\tt.Errorf(\"Error building secret Key %v got;\\n%v\\nwant;\\n%v\", k, pGot, pWant)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestGcp_setGcpPluginDefaults(t *testing.T) {\n\ttype testCase struct {\n\t\tName            string\n\t\tInput           *kfconfig.KfConfig\n\t\tInputSpec       *gcpplugin.GcpPluginSpec\n\t\tEnv             map[string]string\n\t\tEmailGetter     func() (string, error)\n\t\tProjectGetter   func() (string, error)\n\t\tZoneGetter      func() (string, error)\n\t\tExpected        *gcpplugin.GcpPluginSpec\n\t\tExpectedEmail   string\n\t\tExpectedProject string\n\t\tExpectedZone    string\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tName: \"no-plugin-basic-auth\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tkftypes.KUBEFLOW_USERNAME: \"someuser\",\n\t\t\t\tkftypes.KUBEFLOW_PASSWORD: \"password\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(true),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tBasicAuth: &gcpplugin.BasicAuth{\n\t\t\t\t\t\tUsername: \"someuser\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: BasicAuthPasswordSecretName,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tName: \"no-plugin-iap\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tCLIENT_ID: \"someclient\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(true),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tIAP: &gcpplugin.IAP{\n\t\t\t\t\t\tOAuthClientId: \"someclient\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: CLIENT_SECRET,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tName: \"set-email\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tCLIENT_ID: \"someclient\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(true),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tIAP: &gcpplugin.IAP{\n\t\t\t\t\t\tOAuthClientId: \"someclient\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: CLIENT_SECRET,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tProject: \"myproject\",\n\t\t\t\tEmail:   \"myemail\",\n\t\t\t\tZone:    \"us-east1-b\",\n\t\t\t},\n\t\t\tEmailGetter: func() (string, error) {\n\t\t\t\treturn \"myemail\", nil\n\t\t\t},\n\t\t\tProjectGetter: func() (string, error) {\n\t\t\t\treturn \"\\nmyproject \", nil\n\t\t\t},\n\t\t\tZoneGetter: func() (string, error) {\n\t\t\t\treturn \"\\nus-east1-b\\n\", nil\n\t\t\t},\n\t\t\tExpectedEmail:   \"myemail\",\n\t\t\tExpectedProject: \"myproject\",\n\t\t\tExpectedZone:    \"us-east1-b\",\n\t\t},\n\t\t{\n\t\t\t// Make sure emails get trimmed.\n\t\t\tName: \"trim-email\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tCLIENT_ID: \"someclient\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(true),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tIAP: &gcpplugin.IAP{\n\t\t\t\t\t\tOAuthClientId: \"someclient\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: CLIENT_SECRET,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tEmail: \"myemail\",\n\t\t\t},\n\t\t\tEmailGetter: func() (string, error) {\n\t\t\t\treturn \"\\nmyemail\\n\", nil\n\t\t\t},\n\t\t\tExpectedEmail: \"myemail\",\n\t\t},\n\t\t// Verify that we don't override createPipelinePersistentStorage.\n\t\t{\n\t\t\t// Make sure emails get trimmed.\n\t\t\tName: \"no-override\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tInputSpec: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(false),\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tCLIENT_ID: \"someclient\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(false),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tIAP: &gcpplugin.IAP{\n\t\t\t\t\t\tOAuthClientId: \"someclient\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: CLIENT_SECRET,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tEmail: \"myemail\",\n\t\t\t},\n\t\t\tEmailGetter: func() (string, error) {\n\t\t\t\treturn \"\\nmyemail\\n\", nil\n\t\t\t},\n\t\t\tExpectedEmail: \"myemail\",\n\t\t},\n\t\t{\n\t\t\tName: \"iap-not-overwritten\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\tInputSpec: &gcpplugin.GcpPluginSpec{\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tIAP: &gcpplugin.IAP{\n\t\t\t\t\t\tOAuthClientId: \"original_client\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"original_secret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tCLIENT_ID: \"someclient\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(true),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tIAP: &gcpplugin.IAP{\n\t\t\t\t\t\tOAuthClientId: \"original_client\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"original_secret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tName: \"basic-auth-not-overwritten\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tInputSpec: &gcpplugin.GcpPluginSpec{\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tBasicAuth: &gcpplugin.BasicAuth{\n\t\t\t\t\t\tUsername: \"original_user\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"original_secret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tCLIENT_ID: \"someclient\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(true),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tBasicAuth: &gcpplugin.BasicAuth{\n\t\t\t\t\t\tUsername: \"original_user\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"original_secret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tName: \"dm-configs-not-overwritten\",\n\t\t\tInput: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tUseBasicAuth: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\tInputSpec: &gcpplugin.GcpPluginSpec{\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tBasicAuth: &gcpplugin.BasicAuth{\n\t\t\t\t\t\tUsername: \"original_user\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"original_secret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tDeploymentManagerConfig: &gcpplugin.DeploymentManagerConfig{\n\t\t\t\t\tRepoRef: &kfconfig.RepoRef{\n\t\t\t\t\t\tName: \"somerepo\",\n\t\t\t\t\t\tPath: \"somepath\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tEnv: map[string]string{\n\t\t\t\tCLIENT_ID: \"someclient\",\n\t\t\t},\n\t\t\tExpected: &gcpplugin.GcpPluginSpec{\n\t\t\t\tCreatePipelinePersistentStorage: proto.Bool(true),\n\t\t\t\tEnableWorkloadIdentity:          proto.Bool(true),\n\t\t\t\tAuth: &gcpplugin.Auth{\n\t\t\t\t\tBasicAuth: &gcpplugin.BasicAuth{\n\t\t\t\t\t\tUsername: \"original_user\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"original_secret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tDeploymentManagerConfig: &gcpplugin.DeploymentManagerConfig{\n\t\t\t\t\tRepoRef: &kfconfig.RepoRef{\n\t\t\t\t\t\tName: \"somerepo\",\n\t\t\t\t\t\tPath: \"somepath\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor index, c := range cases {\n\t\tif index > 0 {\n\t\t\t// Unset previous environment variables\n\t\t\tfor k, _ := range cases[index-1].Env {\n\t\t\t\tos.Unsetenv(k)\n\t\t\t}\n\t\t}\n\n\t\tfor k, v := range c.Env {\n\t\t\tos.Setenv(k, v)\n\t\t}\n\n\t\ti := c.Input.DeepCopy()\n\n\t\tif c.InputSpec != nil {\n\t\t\ti.SetPluginSpec(GcpPluginName, c.InputSpec)\n\t\t}\n\n\t\tgcp := &Gcp{\n\t\t\tkfDef:            i,\n\t\t\tgcpAccountGetter: c.EmailGetter,\n\t\t\tgcpProjectGetter: c.ProjectGetter,\n\t\t\tgcpZoneGetter:    c.ZoneGetter,\n\t\t}\n\n\t\tif err := gcp.setGcpPluginDefaults(); err != nil {\n\t\t\tt.Errorf(\"Case %v; setGcpPluginDefaults() error %v\", c.Name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tplugin := &gcpplugin.GcpPluginSpec{}\n\t\terr := i.GetPluginSpec(GcpPluginName, plugin)\n\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Case %v; GetPluginSpec() error %v\", c.Name, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !reflect.DeepEqual(plugin, c.Expected) {\n\t\t\tpGot, _ := Pformat(plugin)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Case %v; got:\\n%v\\nwant:\\n%v\", c.Name, pGot, pWant)\n\t\t}\n\n\t\tif c.ExpectedEmail != \"\" && c.ExpectedEmail != i.Spec.Email {\n\t\t\tt.Errorf(\"Case %v; email: got %v; want %v\", c.Name, i.Spec.Email, c.ExpectedEmail)\n\t\t}\n\t\tif c.ExpectedProject != \"\" && c.ExpectedProject != i.Spec.Project {\n\t\t\tt.Errorf(\"Case %v; project: got %v; want %v\", c.Name, i.Spec.Project, c.ExpectedProject)\n\t\t}\n\t\tif c.ExpectedZone != \"\" && c.ExpectedZone != i.Spec.Zone {\n\t\t\tt.Errorf(\"Case %v; zone: got %v; want %v\", c.Name, i.Spec.Zone, c.ExpectedZone)\n\t\t}\n\n\t}\n}\n\nfunc TestGcp_setPodDefault(t *testing.T) {\n\tgroup := \"kubeflow.org\"\n\tversion := \"v1alpha1\"\n\tkind := \"PodDefault\"\n\tnamespace := \"foo-bar-baz\"\n\texpected := map[string]interface{}{\n\t\t\"apiVersion\": group + \"/\" + version,\n\t\t\"kind\":       kind,\n\t\t\"metadata\": map[string]interface{}{\n\t\t\t\"name\":      \"add-gcp-secret\",\n\t\t\t\"namespace\": namespace,\n\t\t},\n\t\t\"spec\": map[string]interface{}{\n\t\t\t\"selector\": map[string]interface{}{\n\t\t\t\t\"matchLabels\": map[string]interface{}{\n\t\t\t\t\t\"add-gcp-secret\": \"true\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"desc\": \"add gcp credential\",\n\t\t\t\"env\": []interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"name\":  \"GOOGLE_APPLICATION_CREDENTIALS\",\n\t\t\t\t\t\"value\": \"/secret/gcp/user-gcp-sa.json\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"volumeMounts\": []interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"name\":      \"secret-volume\",\n\t\t\t\t\t\"mountPath\": \"/secret/gcp\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"volumes\": []interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"name\": \"secret-volume\",\n\t\t\t\t\t\"secret\": map[string]interface{}{\n\t\t\t\t\t\t\"secretName\": \"user-gcp-sa\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tactual := generatePodDefault(group, version, kind, namespace)\n\tif !reflect.DeepEqual(actual.UnstructuredContent(), expected) {\n\t\tpGot, _ := Pformat(actual.UnstructuredContent())\n\t\tpWant, _ := Pformat(expected)\n\t\tt.Errorf(\"PodDefault not matching; got\\n%v\\nwant\\n%v\", pGot, pWant)\n\t}\n}\n\n// Pformat returns a pretty format output of any value.\n// TODO(jlewi): Use utils.PrettyPrint\nfunc Pformat(value interface{}) (string, error) {\n\tif s, ok := value.(string); ok {\n\t\treturn s, nil\n\t}\n\tvalueJson, err := json.MarshalIndent(value, \"\", \"  \")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(valueJson), nil\n}\n"
  },
  {
    "path": "pkg/kfapp/gcp/testdata/doc.go",
    "content": "package testdata\n"
  },
  {
    "path": "pkg/kfapp/gcp/testdata/kfctl_gcp.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1alpha1\nkind: KfDef\nspec:\n  plugins:\n    - name: gcp\n      args:\n        auth:\n          basicAuth:\n            username: someuser\n            password:\n              name: password\n"
  },
  {
    "path": "pkg/kfapp/kfapp.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package kfdef\npackage kfapp\n"
  },
  {
    "path": "pkg/kfapp/kfdef.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package kfdef\npackage kfapp\n"
  },
  {
    "path": "pkg/kfapp/kustomize/kustomize.go",
    "content": "/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage kustomize\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"math/rand\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\terrutil \"k8s.io/apimachinery/pkg/util/errors\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\n\t\"github.com/cenkalti/backoff\"\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/imdario/mergo\"\n\tkfapisv3 \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tkfdefsv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"github.com/otiai10/copy\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\tcrdclientset \"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\t\"k8s.io/client-go/dynamic\"\n\tcorev1 \"k8s.io/client-go/kubernetes/typed/core/v1\"\n\trbacv1 \"k8s.io/client-go/kubernetes/typed/rbac/v1\"\n\t\"k8s.io/client-go/rest\"\n\t\"sigs.k8s.io/kustomize/v3/k8sdeps/kunstruct\"\n\t\"sigs.k8s.io/kustomize/v3/k8sdeps/transformer\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/fs\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/image\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/loader\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/plugins\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/resmap\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/resource\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/target\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/types\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/validators\"\n\t\"sigs.k8s.io/kustomize/v3/plugin/builtin\"\n)\n\n// kustomize implements KfApp Interface\n// It should include functionality needed for the kustomize platform\n// In addition to `kustomize build`, there is `kustomize edit ...`\n// As noted below there are lots of different ways to use edit\n//  kustomize edit add configmap my-configmap --from-file=my-key=file/path --from-literal=my-literal=12345\n//  kustomize edit add configmap my-configmap --from-file=file/path\n//  kustomize edit add configmap my-configmap --from-env-file=env/path.env\n//  kustomize edit add configmap NAME --from-literal=k=v\n//  kustomize edit add resource <filepath>\n//  kustomize edit add patch <filepath>\n//  kustomize edit add base <filepath1>,<filepath2>,<filepath3>\n//  kustomize edit set nameprefix <prefix-value>\n\ntype MapType int\n\nconst (\n\tbasesMap                 MapType = 0\n\tcommonAnnotationsMap     MapType = 1\n\tcommonLabelsMap          MapType = 2\n\timagesMap                MapType = 3\n\tresourcesMap             MapType = 4\n\tcrdsMap                  MapType = 5\n\tvarsMap                  MapType = 6\n\tconfigurationsMap        MapType = 7\n\tconfigMapGeneratorMap    MapType = 8\n\tsecretsMapGeneratorMap   MapType = 9\n\tpatchesStrategicMergeMap MapType = 10\n\tpatchesJson6902Map       MapType = 11\n\tOverlayParamName                 = \"overlay\"\n)\n\ntype kustomize struct {\n\tkfDef            *kfconfig.KfConfig\n\tout              *os.File\n\terr              *os.File\n\tcomponentPathMap map[string]string\n\tcomponentMap     map[string]bool\n\tpackageMap       map[string]*[]string\n\trestConfig       *rest.Config\n\t// when set to true, apply() will skip local kube config, directly build config from restConfig\n\tconfigOverwrite bool\n}\n\nconst (\n\tdefaultUserId = \"anonymous\"\n\toutputDir     = \"kustomize\"\n)\n\n// Setter defines an interface for modifying the plugin.\ntype Setter interface {\n\tSetK8sRestConfig(r *rest.Config)\n}\n\n// GetKfApp is the common entry point for all implementations of the KfApp interface\nfunc GetKfApp(kfdef *kfconfig.KfConfig) kftypesv3.KfApp {\n\t_kustomize := &kustomize{\n\t\tkfDef: kfdef,\n\t\tout:   os.Stdout,\n\t\terr:   os.Stderr,\n\t}\n\n\t// We explicitly do not initiate restConfig  here.\n\t// We want to delay creating the clients until we actually need them.\n\t// This is for two reasons\n\t// 1. We want to allow injecting the config and not relying on\n\t//    $HOME/.kube/config always\n\t// 2. We want to be able to generate the manifests without the K8s cluster existing.\n\t// build restConfig using $HOME/.kube/config if the file exists\n\treturn _kustomize\n}\n\n// initK8sClients initializes the K8s clients if they haven't already been initialized.\n// it is a null op otherwise.\nfunc (kustomize *kustomize) initK8sClients() error {\n\tif kustomize.restConfig == nil {\n\t\tlog.Infof(\"Initializing a default restConfig for Kubernetes\")\n\t\tkustomize.restConfig = kftypesv3.GetConfig()\n\t}\n\n\treturn nil\n}\n\nfunc (kustomize *kustomize) render(app kfconfig.Application) ([]byte, error) {\n\tkustomizeDir := path.Join(kustomize.kfDef.Spec.AppDir, outputDir)\n\tresMap, err := EvaluateKustomizeManifest(path.Join(kustomizeDir, app.Name))\n\tif err != nil {\n\t\tlog.Errorf(\"Error evaluating kustomization manifest for %v: %v\", app.Name, err)\n\t\treturn nil, &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error evaluating kustomization manifest for %v: %v\", app.Name, err),\n\t\t}\n\t}\n\n\tsortResourceByKind(resMap, utils.InstallOrder)\n\n\t// check to set owner references for resources if installed through kubeflow operator\n\tannotations := kustomize.kfDef.GetAnnotations()\n\tsetOperatorAnnotation := false\n\tif setOperator, ok := annotations[strings.Join([]string{utils.KfDefAnnotation, utils.SetAnnotation}, \"/\")]; ok {\n\t\tif setOperatorBool, err := strconv.ParseBool(setOperator); err == nil {\n\t\t\tsetOperatorAnnotation = setOperatorBool\n\t\t}\n\t}\n\n\t//TODO this should be streamed\n\tvar data []byte\n\tif setOperatorAnnotation {\n\t\t// retrieve the UID of the KfDef resource using dynamic client\n\t\tconfig, _ := rest.InClusterConfig()\n\t\tdyn, err := dynamic.NewForConfig(config)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"failed to create dynamic client: %v\", err),\n\t\t\t}\n\t\t}\n\t\tkfDefRes := schema.GroupVersionResource{Group: \"kfdef.apps.kubeflow.org\", Version: \"v1\", Resource: \"kfdefs\"}\n\t\tinstance, err := dyn.Resource(kfDefRes).Namespace(kustomize.kfDef.GetNamespace()).Get(kustomize.kfDef.GetName(), metav1.GetOptions{})\n\t\tif err != nil {\n\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"failed to get the KfDef object: %v\", err),\n\t\t\t}\n\t\t}\n\t\tdata, err = GenerateYamlWithOperatorAnnotation(resMap, instance)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"can not encode component %v as yaml: %v\", app.Name, err),\n\t\t\t}\n\t\t}\n\t} else {\n\t\tdata, err = resMap.AsYaml()\n\t\tif err != nil {\n\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"can not encode component %v as yaml: %v\", app.Name, err),\n\t\t\t}\n\t\t}\n\t}\n\treturn data, nil\n}\n\n// Dump prints the kustomize generated resources to stdout\nfunc (kustomize *kustomize) Dump(resources kftypesv3.ResourceEnum) error {\n\n\tapplications := make(map[string]bool)\n\tfor _, app := range kustomize.kfDef.Spec.Applications {\n\t\tif applications[app.Name] == true {\n\t\t\t// if the application name already\n\t\t\tcontinue\n\t\t}\n\t\tapplications[app.Name] = true\n\n\t\tdata, err := kustomize.render(app)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfmt.Println(string(data))\n\t\tfmt.Println(\"---\")\n\t}\n\treturn nil\n}\n\n// Apply deploys kustomize generated resources to the kubenetes api server\nfunc (kustomize *kustomize) Apply(resources kftypesv3.ResourceEnum) error {\n\tvar restConfig *rest.Config = nil\n\tif kustomize.configOverwrite && kustomize.restConfig != nil {\n\t\trestConfig = kustomize.restConfig\n\t}\n\tapply, err := utils.NewApply(kustomize.kfDef.ObjectMeta.Namespace, restConfig)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Read clusterName and write to KfDef.\n\tkubeconfig := kftypesv3.GetKubeConfig()\n\tif kubeconfig == nil {\n\t\tlog.Warnf(\"Unable to load .kubeconfig.\")\n\t} else {\n\t\tcurrentCtx := kubeconfig.CurrentContext\n\t\tif ctx, ok := kubeconfig.Contexts[currentCtx]; !ok || ctx == nil {\n\t\t\tlog.Errorf(\"Cannot find current-context in kubeconfig.\")\n\t\t} else {\n\t\t\tlog.Infof(\"Log cluster name into KfDef: %v\", ctx.Cluster)\n\t\t\tkustomize.kfDef.ClusterName = ctx.Cluster\n\t\t}\n\t}\n\n\tapplications := make(map[string]bool)\n\tfor _, app := range kustomize.kfDef.Spec.Applications {\n\t\tif applications[app.Name] == true {\n\t\t\t// if the application name already\n\t\t\tcontinue\n\t\t}\n\t\tapplications[app.Name] = true\n\n\t\tlog.Infof(\"Deploying application %v\", app.Name)\n\t\tdata, err := kustomize.render(app)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// TODO(https://github.com/kubeflow/manifests/issues/806): Bump the timeout because cert-manager takes\n\t\t// a long time to start. Any application that needs to create a certificate will fail because it won't\n\t\t// be able to create certificates if cert-manager is unavailable. We should try to identify Permanent Errors\n\t\t// and return a PermanentError to avoid retrying and taking 10 minutes to fail.\n\t\tb := utils.NewDefaultBackoff()\n\t\tb.MaxElapsedTime = 10 * time.Minute\n\t\terr = backoff.RetryNotify(\n\t\t\tfunc() error {\n\t\t\t\treturn apply.Apply(data)\n\t\t\t},\n\t\t\tb,\n\t\t\tfunc(e error, duration time.Duration) {\n\t\t\t\tlog.Warnf(\"Encountered error applying application %v: %v\", app.Name, e)\n\t\t\t\tlog.Warnf(\"Will retry in %.0f seconds.\", duration.Seconds())\n\t\t\t})\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Permanently failed applying application %v: %v\", app.Name, err)\n\t\t\treturn err\n\t\t}\n\t\tlog.Infof(\"Successfully applied application %v\", app.Name)\n\t}\n\n\t// Default user namespace when multi-tenancy enabled\n\tdefaultProfileNamespace := kftypesv3.EmailToDefaultName(kustomize.kfDef.Spec.Email)\n\t// Default user namespace when multi-tenancy disabled\n\tanonymousNamespace := \"anonymous\"\n\tb := utils.NewDefaultBackoff()\n\terr = backoff.Retry(func() error {\n\t\tif !(apply.IfNamespaceExist(defaultProfileNamespace) || apply.IfNamespaceExist(anonymousNamespace)) {\n\t\t\tmsg := \"Default user namespace pending creation...\"\n\t\t\tlog.Warnf(msg)\n\t\t\treturn &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\t\tMessage: msg,\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}, b)\n\tif err != nil {\n\t\tlog.Warnf(\"Default namespace creation skipped\")\n\t}\n\treturn nil\n}\n\n// deleteGlobalResources is called from Delete and deletes CRDs, ClusterRoles, ClusterRoleBindings\nfunc (kustomize *kustomize) deleteGlobalResources() error {\n\tif err := kustomize.initK8sClients(); err != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"kustomize plugin couldn't initialize a K8s client: %v\", err),\n\t\t}\n\t}\n\tapiextclientset, err := crdclientset.NewForConfig(kustomize.restConfig)\n\tif err != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"couldn't get apiextensions client: %v\", err),\n\t\t}\n\t}\n\tdo := &metav1.DeleteOptions{}\n\tlo := metav1.ListOptions{\n\t\tLabelSelector: kftypesv3.DefaultAppLabel + \"=\" + kustomize.kfDef.Name,\n\t}\n\tcrdsErr := apiextclientset.CustomResourceDefinitions().DeleteCollection(do, lo)\n\tif crdsErr != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't delete customresourcedefinitions: %v\", crdsErr),\n\t\t}\n\t}\n\trbacclient, err := rbacv1.NewForConfig(kustomize.restConfig)\n\tif err != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"couldn't get rbac/v1 client: %v\", err),\n\t\t}\n\t}\n\tcrbsErr := rbacclient.ClusterRoleBindings().DeleteCollection(do, lo)\n\tif crbsErr != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't delete clusterrolebindings: %v\", crbsErr),\n\t\t}\n\t}\n\tcrsErr := rbacclient.ClusterRoles().DeleteCollection(do, lo)\n\tif crsErr != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't delete clusterroles: %v\", crsErr),\n\t\t}\n\t}\n\treturn nil\n}\n\n// Delete is called from 'kfctl delete ...'. Will delete all resources deployed from the Apply method\nfunc (kustomize *kustomize) Delete(resources kftypesv3.ResourceEnum) error {\n\tannotations := kustomize.kfDef.GetAnnotations()\n\tforceDelete := false\n\tif forceDel, ok := annotations[strings.Join([]string{utils.KfDefAnnotation, utils.ForceDelete}, \"/\")]; ok {\n\t\tif forceDelBool, err := strconv.ParseBool(forceDel); err == nil {\n\t\t\tforceDelete = forceDelBool\n\t\t}\n\t}\n\tif forceDelete {\n\t\tlog.Warnf(\"Running force deletion.\")\n\t}\n\n\t// Get bool value indicating whether this func is called from kubeflow operator\n\tbyOperator := false\n\tif byOperatorAnn, ok := annotations[strings.Join([]string{utils.KfDefAnnotation, utils.InstallByOperator}, \"/\")]; ok {\n\t\tif byOperatorAnnBol, err := strconv.ParseBool(byOperatorAnn); err == nil {\n\t\t\tbyOperator = byOperatorAnnBol\n\t\t}\n\t}\n\n\t// Get kubeconfig for cluster and initialize clients\n\tmsg := \"\"\n\tkubeconfig := kftypesv3.GetKubeConfig()\n\tif kubeconfig == nil {\n\t\tmsg = \"unable to load .kubeconfig.\"\n\t} else {\n\t\tcurrentCtx := kubeconfig.CurrentContext\n\t\tif ctx, ok := kubeconfig.Contexts[currentCtx]; !ok || ctx == nil {\n\t\t\tmsg = \"cannot find current-context in kubeconfig.\"\n\t\t} else {\n\t\t\tif kustomize.kfDef.ClusterName != ctx.Cluster {\n\t\t\t\tmsg = fmt.Sprintf(\"cluster name doesn't match: KfDef(%v) v.s. current-context(%v)\",\n\t\t\t\t\tkustomize.kfDef.ClusterName, ctx.Cluster)\n\t\t\t}\n\t\t}\n\t}\n\tif msg != \"\" {\n\t\tif forceDelete {\n\t\t\tlog.Warnf(msg)\n\t\t} else {\n\t\t\treturn &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\t\tMessage: msg,\n\t\t\t}\n\t\t}\n\t}\n\tkustomize.initK8sClients()\n\tkubeclient, err := client.New(kustomize.restConfig, client.Options{})\n\tif err != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error initializing k8s client: %v\", err),\n\t\t}\n\t}\n\n\t// Delete in reverse application order\n\tkustomizeDir := path.Join(kustomize.kfDef.Spec.AppDir, outputDir)\n\terrList := []error{}\n\tfor idx := range kustomize.kfDef.Spec.Applications {\n\t\tapp := &kustomize.kfDef.Spec.Applications[len(kustomize.kfDef.Spec.Applications)-1-idx]\n\t\tlog.Infof(\"Deleting application %v\", app.Name)\n\t\tresMap, err := EvaluateKustomizeManifest(path.Join(kustomizeDir, app.Name))\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Error evaluating kustomization manifest for %v: %v\", app.Name, err)\n\t\t\treturn &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"error evaluating kustomization manifest for %v: %v\", app.Name, err),\n\t\t\t}\n\t\t}\n\n\t\t// Sort resources by kind to make sure we don't experience namespace terminating hanging.\n\t\tsortResourceByKind(resMap, utils.UninstallOrder)\n\n\t\tyamlBytes, err := resMap.AsYaml()\n\t\tif err != nil {\n\t\t\treturn &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"error evaluating kustomization manifest for %v: %v\", app.Name, err),\n\t\t\t}\n\t\t}\n\t\tresources, err := utils.SplitYAML(yamlBytes)\n\t\tif err != nil {\n\t\t\treturn &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"error splitting yaml: %v\", err),\n\t\t\t}\n\t\t}\n\t\tfor _, r := range resources {\n\t\t\terr := utils.DeleteResource(r, kubeclient, 5*time.Minute, byOperator)\n\t\t\tif err != nil {\n\t\t\t\tmsg := fmt.Sprintf(\"error evaluating kustomization manifest for %v: %v\", app.Name, err)\n\t\t\t\terrList = append(errList, errors.New(msg))\n\t\t\t\tlog.Warn(msg)\n\t\t\t}\n\t\t}\n\t}\n\n\taggrError := errutil.NewAggregate(errList)\n\tif aggrError != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error deleting kustomize manifests: %v\", aggrError),\n\t\t}\n\t}\n\n\t// Finally, delete the kubeflow namespace\n\t// TODO(yanniszark): Remove this once the Kubeflow namespace is created by kustomize manifests\n\n\tcorev1client, err := corev1.NewForConfig(kustomize.restConfig)\n\tif err != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"couldn't get core/v1 client: %v\", err),\n\t\t}\n\t}\n\tnamespace := kustomize.kfDef.Namespace\n\tns, nsMissingErr := corev1client.Namespaces().Get(namespace, metav1.GetOptions{})\n\tif nsMissingErr == nil {\n\t\t// if the func is called by the Kubeflow operator, validate it is installed through the operator\n\t\tif byOperator {\n\t\t\tanns := ns.GetAnnotations()\n\t\t\tkfdefAnn := strings.Join([]string{utils.KfDefAnnotation, utils.KfDefInstance}, \"/\")\n\t\t\t_, found := anns[kfdefAnn]\n\t\t\tif !found {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\n\t\tlog.Infof(\"Deleting namespace: %v\", namespace)\n\t\tnsErr := corev1client.Namespaces().Delete(ns.Name, metav1.NewDeleteOptions(int64(100)))\n\t\tif nsErr != nil {\n\t\t\treturn &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"couldn't delete namespace %v: %v\", namespace, nsErr),\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// sortResourceByKind does in-place sort of resources by Kind.\nfunc sortResourceByKind(resMap resmap.ResMap, order utils.SortOrder) {\n\tresourcesInUninstallOrder := utils.SortByKind(resMap.Resources(), order)\n\n\t// Need to remove existing resource and append them in order.\n\tallIdsToRemove := resMap.AllIds()\n\tfor _, idToRemove := range allIdsToRemove {\n\t\tresMap.Remove(idToRemove)\n\t}\n\n\tfor _, resourceToAdd := range resourcesInUninstallOrder {\n\t\tresMap.Append(resourceToAdd)\n\t}\n}\n\n// Generate is called from 'kfctl generate ...' and produces yaml output files under <deployment>/kustomize.\n// One yaml file per component\nfunc (kustomize *kustomize) Generate(resources kftypesv3.ResourceEnum) error {\n\tgenerate := func() error {\n\t\tkustomizeDir := path.Join(kustomize.kfDef.Spec.AppDir, outputDir)\n\n\t\tif _, err := os.Stat(kustomizeDir); err == nil {\n\t\t\t// When using the new stacks code the directory might already exist because it could have\n\t\t\t// been created by calls to SetApplicationParameter. For the legacy code path (no stacks) we preserve\n\t\t\t// the existing code path of not rerunning generate if the directory already exists.\n\t\t\tif !kustomize.kfDef.UsingStacks() {\n\t\t\t\t// Noop if the directory already exists.\n\t\t\t\tlog.Infof(\"Folder %v exists, skip kustomize.Generate\", kustomizeDir)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t} else if !os.IsNotExist(err) {\n\t\t\tlog.Errorf(\"Stat folder %v error: %v; try deleting it...\", kustomizeDir, err)\n\t\t\t_ = os.RemoveAll(kustomizeDir)\n\t\t}\n\n\t\tkustomizeDirErr := os.MkdirAll(kustomizeDir, os.ModePerm)\n\t\tif kustomizeDirErr != nil {\n\t\t\treturn &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"couldn't create directory %v: %v\", kustomizeDir, kustomizeDirErr),\n\t\t\t}\n\t\t}\n\n\t\t_, ok := kustomize.kfDef.GetRepoCache(kftypesv3.ManifestsRepoName)\n\t\tif !ok {\n\t\t\tlog.Infof(\"Repo %v not listed in KfDef.Status; Resync'ing cache\", kftypesv3.ManifestsRepoName)\n\t\t\tif err := kustomize.kfDef.SyncCache(); err != nil {\n\t\t\t\tlog.Errorf(\"Syncing the cached failed: %v\", err)\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t}\n\n\t\t// Check again after sync\n\t\t_, ok = kustomize.kfDef.GetRepoCache(kftypesv3.ManifestsRepoName)\n\t\tif !ok {\n\t\t\treturn errors.WithStack(fmt.Errorf(\"Repo %v not listed in KfDef.Status; \", kftypesv3.ManifestsRepoName))\n\t\t}\n\n\t\t// determine whether we are using the new pattern of using kustomize to build stacks.\n\t\t// hasStack := kustomize.kfDef.UsingStacks()\n\t\tfor _, app := range kustomize.kfDef.Spec.Applications {\n\t\t\tlog.Infof(\"Processing application: %v\", app.Name)\n\n\t\t\tif app.KustomizeConfig == nil {\n\t\t\t\terr := fmt.Errorf(\"application %v is missing KustomizeConfig\", app.Name)\n\t\t\t\tlog.Errorf(\"%v\", err)\n\t\t\t\treturn &kfapisv3.KfError{\n\t\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\t\tMessage: err.Error(),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trepoName := app.KustomizeConfig.RepoRef.Name\n\t\t\trepoCache, ok := kustomize.kfDef.GetRepoCache(repoName)\n\t\t\tif !ok {\n\t\t\t\terr := fmt.Errorf(\"application %v refers to repo %v which wasn't found in KfDef.Status.ReposCache\", app.Name, repoName)\n\t\t\t\tlog.Errorf(\"%v\", err)\n\t\t\t\treturn &kfapisv3.KfError{\n\t\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\t\tMessage: err.Error(),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tappPath := path.Join(repoCache.LocalPath, app.KustomizeConfig.RepoRef.Path)\n\n\t\t\tif kustomize.kfDef.UsingStacks() {\n\n\t\t\t\tif filepath.IsAbs(appPath) {\n\t\t\t\t\t// The appPath needs to be a relative path because we use it as a resource location in the kustomize\n\t\t\t\t\t// file\n\t\t\t\t\tappDir, err := filepath.Abs(kustomize.kfDef.Spec.AppDir)\n\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\terrors.WithStack(fmt.Errorf(\"There was a problem computing absolute path of %v; error; %v \", kustomize.kfDef.Spec.AppDir, err))\n\t\t\t\t\t}\n\t\t\t\t\trelPath, err := filepath.Rel(appDir, appPath)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\terrors.WithStack(fmt.Errorf(\"There was a problem computing filePath.Rel(%v, %v); error; %v \", appDir, appPath, err))\n\t\t\t\t\t}\n\n\t\t\t\t\tappPath = relPath\n\t\t\t\t}\n\t\t\t\t// We handle generating the kustomize dir for application stacks differently.\n\t\t\t\tstackAppDir := path.Join(kustomizeDir, app.Name)\n\n\t\t\t\t// Path to the stack inside the cache.\n\t\t\t\tstacksCacheDir := filepath.Join(\"../..\", appPath)\n\t\t\t\tif _, err := createStackAppKustomization(stackAppDir, stacksCacheDir); err != nil {\n\t\t\t\t\treturn errors.WithStack(fmt.Errorf(\"There was a problem building the kustomize app for the Kubeflow application stack; %v \", err))\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// TODO(jlewi): This code path should eventually go away once we are fully migrated to the use\n\t\t\t\t// of stacks.\n\t\t\t\t// Copy the component to kustomizeDir\n\t\t\t\tif err := copy.Copy(appPath, path.Join(kustomizeDir, app.Name)); err != nil {\n\t\t\t\t\treturn &kfapisv3.KfError{\n\t\t\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't copy application %s: %v\", app.Name, err),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif err := GenerateKustomizationFile(kustomize.kfDef, kustomizeDir, app.Name,\n\t\t\t\t\tapp.KustomizeConfig.Overlays, app.KustomizeConfig.Parameters); err != nil {\n\t\t\t\t\treturn &kfapisv3.KfError{\n\t\t\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't generate kustomization file for component %s: %v\", app.Name, err),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tswitch resources {\n\tcase kftypesv3.PLATFORM:\n\tcase kftypesv3.ALL:\n\t\tfallthrough\n\tcase kftypesv3.K8S:\n\t\tgenerateErr := generate()\n\t\tif generateErr != nil {\n\t\t\treturn fmt.Errorf(\"Kustomize generate failed: %v\", generateErr)\n\t\t}\n\t}\n\treturn nil\n}\n\n// createStackAppKustomization generates a kustomization.yaml file suitable for the kubeflow application stack.\n// stackAppDir is the directory to create for the kustomize package.\n// basePath is the path to the kustomize package to use as the base package.\n//\n// Returns the path to the kusotmizationFile.\n//\n// If the kustomization.yaml already exists then the changes are merged in.\nfunc createStackAppKustomization(stackAppDir string, basePath string) (string, error) {\n\tkustomizationFile := filepath.Join(stackAppDir, kftypesv3.KustomizationFile)\n\n\tif _, err := os.Stat(stackAppDir); err == nil {\n\t\t// Noop if the directory already exists.\n\t\tlog.Infof(\"folder %v exists\", stackAppDir)\n\t} else if os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating folder %v\", stackAppDir)\n\t\tif stackAppDirErr := os.MkdirAll(stackAppDir, os.ModePerm); stackAppDirErr != nil {\n\t\t\treturn \"\", &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"couldn't create directory %v Error %v\", stackAppDir, stackAppDirErr),\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn \"\", errors.WithStack(errors.Wrapf(err, \"Unexpected error trying to access directory: %v\", stackAppDir))\n\t}\n\n\tkustomization := &types.Kustomization{}\n\n\tcontents, err := ioutil.ReadFile(kustomizationFile)\n\n\t// The kustomization file may not exist yet in which case we keep going because we will just create it.\n\tif err == nil {\n\t\tif err := yaml.Unmarshal(contents, kustomization); err != nil {\n\t\t\treturn \"\", errors.WithStack(errors.Wrapf(err, \"Failed to unmashal %v\", kustomizationFile))\n\t\t}\n\t} else if err != nil && !os.IsNotExist(err) {\n\t\treturn \"\", errors.WithStack(errors.Wrapf(err, \"Failed to read: %v\", kustomizationFile))\n\t}\n\n\t// Create the kustomization file for the stack directory.\n\t// We explicitly do not set namespace because we want to use the default namespace set in each kustomize\n\t// application.\n\tkustomization.TypeMeta = types.TypeMeta{\n\t\tKind:       \"Kustomization\",\n\t\tAPIVersion: \"kustomize.config.k8s.io/v1beta1\",\n\t}\n\n\thasBasePath := false\n\tfor _, r := range kustomization.Resources {\n\t\tif string(r) == basePath {\n\t\t\thasBasePath = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !hasBasePath {\n\t\tkustomization.Resources = append(kustomization.Resources, basePath)\n\t}\n\tyaml, err := yaml.Marshal(kustomization)\n\n\tif err != nil {\n\t\treturn \"\", errors.WithStack(errors.Wrapf(err, \"Error trying to marshal kustomization for kubeflow apps stack:\"))\n\t}\n\n\tkustomizationFileErr := ioutil.WriteFile(kustomizationFile, yaml, 0644)\n\tif kustomizationFileErr != nil {\n\t\treturn \"\", &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error writing to %v Error %v\", kustomizationFile, kustomizationFileErr),\n\t\t}\n\t}\n\n\treturn kustomizationFile, nil\n}\n\n// Init is called from 'kfctl init ...' and creates a <deployment> directory with an app.yaml file that\n// holds deployment information like components, parameters\nfunc (kustomize *kustomize) Init(resources kftypesv3.ResourceEnum) error {\n\treturn nil\n}\n\n// mapDirs is a recursive method that will return a map of component -> path-to-kustomization.yaml\n// under the manifests downloaded cache\nfunc (kustomize *kustomize) mapDirs(dirPath string, root bool, depth int, leafMap map[string]string) map[string]string {\n\tdirName := path.Base(dirPath)\n\t// package is component, stop here\n\tif depth == 1 && kustomize.packageMap[dirName] != nil && kustomize.componentMap[dirName] {\n\t\tsubdirCheck := path.Join(dirPath, dirName)\n\t\t// border case manifests/jupyter/jupyter\n\t\tif _, err := os.Stat(subdirCheck); err != nil {\n\t\t\tleafMap[dirName] = dirName\n\t\t\tarrayOfComponents := *kustomize.packageMap[dirName]\n\t\t\tarrayOfComponents = append(arrayOfComponents, dirName)\n\t\t\tkustomize.packageMap[dirName] = &arrayOfComponents\n\t\t\treturn leafMap\n\t\t}\n\t}\n\tfiles, err := ioutil.ReadDir(dirPath)\n\tif err != nil {\n\t\treturn leafMap\n\t}\n\tfor _, f := range files {\n\t\tif f.IsDir() {\n\t\t\tleafDir := path.Join(dirPath, f.Name())\n\t\t\tif depth < 2 {\n\t\t\t\tkustomize.mapDirs(leafDir, false, depth+1, leafMap)\n\t\t\t}\n\t\t}\n\t}\n\tif depth == 2 {\n\t\trepoCache, ok := kustomize.kfDef.GetRepoCache(kftypesv3.ManifestsRepoName)\n\t\tif !ok {\n\t\t\tlog.Fatal(\"Manifest repo not found in cache\")\n\t\t}\n\t\tcomponentPath := extractSuffix(repoCache.LocalPath, dirPath)\n\t\tpackageName := strings.Split(componentPath, \"/\")[0]\n\t\tif components, exists := kustomize.packageMap[packageName]; exists {\n\t\t\tleafMap[path.Base(dirPath)] = componentPath\n\t\t\tarrayOfComponents := *components\n\t\t\tarrayOfComponents = append(arrayOfComponents, dirName)\n\t\t\tkustomize.packageMap[packageName] = &arrayOfComponents\n\t\t}\n\t}\n\treturn leafMap\n}\n\nfunc (kustomize *kustomize) SetK8sRestConfig(r *rest.Config) {\n\tkustomize.restConfig = r\n\tkustomize.configOverwrite = true\n}\n\n// GetKustomization will read a kustomization.yaml and return Kustomization type\nfunc GetKustomization(kustomizationPath string) *types.Kustomization {\n\tkustomizationFile := filepath.Join(kustomizationPath, kftypesv3.KustomizationFile)\n\tdata, err := ioutil.ReadFile(kustomizationFile)\n\tif err != nil {\n\t\tlog.Warnf(\"Cannot get kustomization from %v: %v\", kustomizationPath, err)\n\t\treturn nil\n\t}\n\tkustomization := &types.Kustomization{}\n\tif err = yaml.Unmarshal(data, kustomization); err != nil {\n\t\tlog.Warnf(\"Cannot unmarshal kustomization from %v: %v\", kustomizationPath, err)\n\t\treturn nil\n\t}\n\treturn kustomization\n}\n\n// ReadUnstructured will read a resource .yaml and return the Unstructured type\nfunc ReadUnstructured(kfDefFile string) (*unstructured.Unstructured, error) {\n\tdata, err := ioutil.ReadFile(kfDefFile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdef := &unstructured.Unstructured{}\n\tif err = yaml.Unmarshal(data, def); err != nil {\n\t\treturn nil, err\n\t}\n\treturn def, nil\n}\n\n// ReadKfDef will read a config .yaml and return the KfDef type\nfunc ReadKfDef(kfDefFile string) *kfdefsv3.KfDef {\n\tdata, err := ioutil.ReadFile(kfDefFile)\n\tif err != nil {\n\t\treturn nil\n\t}\n\tkfdef := &kfdefsv3.KfDef{}\n\tif err = yaml.Unmarshal(data, kfdef); err != nil {\n\t\treturn nil\n\t}\n\treturn kfdef\n}\n\n// WriteKfDef will write a KfDef to a config .yaml\nfunc WriteKfDef(kfdef *kfdefsv3.KfDef, kfdefpath string) error {\n\tdata, err := yaml.Marshal(kfdef)\n\tif err != nil {\n\t\treturn err\n\t}\n\twriteErr := ioutil.WriteFile(kfdefpath, data, 0644)\n\tif writeErr != nil {\n\t\treturn writeErr\n\t}\n\treturn nil\n}\n\n// MergeKustomization will merge the child into the parent\n// if the child has no bases, then the parent just needs to add the child as base\n// otherwise the parent needs to merge with behaviors\n// Multiple overlays are constrained in what they can merge\n// which exclude NamePrefixes, NameSuffixes, CommonLabels, CommonAnnotations.\n// Any of these will generate an error\nfunc MergeKustomization(compDir string, targetDir string, kfDef *kfconfig.KfConfig, params []kfconfig.NameValue,\n\tparent *types.Kustomization, child *types.Kustomization, kustomizationMaps map[MapType]map[string]bool) error {\n\n\tparamMap := make(map[string]string)\n\tfor _, nv := range params {\n\t\tparamMap[nv.Name] = nv.Value\n\t}\n\tupdateParamFiles := func() error {\n\t\tparamFile := filepath.Join(targetDir, kftypesv3.KustomizationParamFile)\n\t\tif _, err := os.Stat(paramFile); err == nil {\n\t\t\tparams, paramFileErr := readLines(paramFile)\n\t\t\tif paramFileErr != nil {\n\t\t\t\treturn &kfapisv3.KfError{\n\t\t\t\t\tCode:    int(kfapisv3.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: fmt.Sprintf(\"could not open %v: %v\", paramFile, paramFileErr),\n\t\t\t\t}\n\t\t\t}\n\t\t\t// in params.env look for name=value that we can substitute from componentParams[component]\n\t\t\t// or if there is just namespace= or project= - fill in the values from KfDef\n\t\t\tfor i, param := range params {\n\t\t\t\tparamName := strings.Split(param, \"=\")[0]\n\t\t\t\tif val, ok := paramMap[paramName]; ok && val != \"\" {\n\t\t\t\t\tswitch paramName {\n\t\t\t\t\tcase \"generateName\":\n\t\t\t\t\t\tarr := strings.Split(param, \"=\")\n\t\t\t\t\t\tif len(arr) == 1 || arr[1] == \"\" {\n\t\t\t\t\t\t\tb := make([]byte, 4) //equals 8 charachters\n\t\t\t\t\t\t\trand.Read(b)\n\t\t\t\t\t\t\ts := hex.EncodeToString(b)\n\t\t\t\t\t\t\tval += s\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparams[i] = paramName + \"=\" + val\n\t\t\t\t} else {\n\t\t\t\t\tswitch paramName {\n\t\t\t\t\tcase \"appName\":\n\t\t\t\t\t\tparams[i] = paramName + \"=\" + kfDef.Name\n\t\t\t\t\tcase \"namespace\":\n\t\t\t\t\t\tparams[i] = paramName + \"=\" + kfDef.Namespace\n\t\t\t\t\tcase \"project\":\n\t\t\t\t\t\tparams[i] = paramName + \"=\" + kfDef.Spec.Project\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tparamFileErr = writeLines(params, paramFile)\n\t\t\tif paramFileErr != nil {\n\t\t\t\treturn &kfapisv3.KfError{\n\t\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"could not update %v: %v\", paramFile, paramFileErr),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tupdateGeneratorArgs := func(parentGeneratorArgs *types.GeneratorArgs, childGeneratorArgs types.GeneratorArgs) {\n\t\tif childGeneratorArgs.EnvSources != nil && len(childGeneratorArgs.EnvSources) > 0 {\n\t\t\tparentGeneratorArgs.EnvSources = make([]string, 0)\n\t\t\tfor _, envSource := range childGeneratorArgs.EnvSources {\n\t\t\t\tenvAbsolutePathSource := path.Join(targetDir, envSource)\n\t\t\t\tparentGeneratorArgs.EnvSources = append(parentGeneratorArgs.EnvSources, extractSuffix(compDir, envAbsolutePathSource))\n\t\t\t}\n\t\t}\n\t\tif childGeneratorArgs.EnvSource != \"\" {\n\t\t\tenvAbsolutePathSource := path.Join(targetDir, childGeneratorArgs.EnvSource)\n\t\t\tenvSource := extractSuffix(compDir, envAbsolutePathSource)\n\t\t\tparentGeneratorArgs.EnvSource = envSource\n\t\t}\n\t\tif childGeneratorArgs.FileSources != nil && len(childGeneratorArgs.FileSources) > 0 {\n\t\t\tparentGeneratorArgs.FileSources = make([]string, 0)\n\t\t\tfor _, fileSource := range childGeneratorArgs.FileSources {\n\t\t\t\tfileAbsolutePathSource := path.Join(targetDir, fileSource)\n\t\t\t\tparentGeneratorArgs.EnvSource = extractSuffix(compDir, fileAbsolutePathSource)\n\t\t\t}\n\t\t}\n\t\tif childGeneratorArgs.LiteralSources != nil && len(childGeneratorArgs.LiteralSources) > 0 {\n\t\t\tparentGeneratorArgs.LiteralSources = make([]string, 0)\n\t\t\tfor _, literalSource := range childGeneratorArgs.LiteralSources {\n\t\t\t\tparentGeneratorArgs.LiteralSources = append(parentGeneratorArgs.LiteralSources, literalSource)\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateConfigMapArgs := func(parentConfigMapArgs *types.ConfigMapArgs, childConfigMapArgs types.ConfigMapArgs) {\n\t\tparentConfigMapArgs.Name = childConfigMapArgs.Name\n\t\tparentConfigMapArgs.Namespace = childConfigMapArgs.Namespace\n\t\tupdateGeneratorArgs(&parentConfigMapArgs.GeneratorArgs, childConfigMapArgs.GeneratorArgs)\n\t\tbehavior := types.NewGenerationBehavior(childConfigMapArgs.Behavior)\n\t\tswitch behavior {\n\t\tcase types.BehaviorCreate:\n\t\t\tif _, ok := kustomizationMaps[configMapGeneratorMap][childConfigMapArgs.Name]; !ok {\n\t\t\t\tparent.ConfigMapGenerator = append(parent.ConfigMapGenerator, *parentConfigMapArgs)\n\t\t\t\tkustomizationMaps[configMapGeneratorMap][childConfigMapArgs.Name] = true\n\t\t\t}\n\t\tcase types.BehaviorMerge, types.BehaviorReplace, types.BehaviorUnspecified:\n\t\t\tfallthrough\n\t\tdefault:\n\t\t\tparentConfigMapArgs.Behavior = behavior.String()\n\t\t\tparent.ConfigMapGenerator = append(parent.ConfigMapGenerator, *parentConfigMapArgs)\n\t\t\tkustomizationMaps[configMapGeneratorMap][childConfigMapArgs.Name] = true\n\t\t}\n\t}\n\n\tif err := updateParamFiles(); err != nil {\n\t\treturn err\n\t}\n\tif child.Bases == nil {\n\t\tbasePath := extractSuffix(compDir, targetDir)\n\t\tif _, ok := kustomizationMaps[basesMap][basePath]; !ok {\n\t\t\tparent.Bases = append(parent.Bases, basePath)\n\t\t\tkustomizationMaps[basesMap][basePath] = true\n\t\t}\n\t\treturn nil\n\t}\n\tfor _, value := range child.Bases {\n\t\tbaseAbsolutePath := path.Join(targetDir, value)\n\t\tbasePath := extractSuffix(compDir, baseAbsolutePath)\n\t\tif _, ok := kustomizationMaps[basesMap][basePath]; !ok {\n\t\t\tparent.Bases = append(parent.Bases, basePath)\n\t\t\tkustomizationMaps[basesMap][basePath] = true\n\t\t} else {\n\t\t\tchildPath := extractSuffix(compDir, targetDir)\n\t\t\tkustomizationMaps[basesMap][childPath] = true\n\t\t}\n\t}\n\tif child.NamePrefix != \"\" && parent.NamePrefix == \"\" {\n\t\tparent.NamePrefix = child.NamePrefix\n\t}\n\tif child.NameSuffix != \"\" && parent.NameSuffix == \"\" {\n\t\tparent.NameSuffix = child.NameSuffix\n\t}\n\tfor k, v := range child.CommonLabels {\n\t\t//allow replacement\n\t\tparent.CommonLabels[k] = v\n\t\tkustomizationMaps[commonLabelsMap][k] = true\n\t}\n\tfor k, v := range child.CommonAnnotations {\n\t\t//allow replacement\n\t\tparent.CommonAnnotations[k] = v\n\t\tkustomizationMaps[commonAnnotationsMap][k] = true\n\t}\n\n\tif child.GeneratorOptions != nil && parent.GeneratorOptions == nil {\n\t\tparent.GeneratorOptions = child.GeneratorOptions\n\t}\n\tfor _, value := range child.Resources {\n\t\tresourceAbsoluteFile := filepath.Join(targetDir, string(value))\n\t\tresourceFile := extractSuffix(compDir, resourceAbsoluteFile)\n\t\tif _, ok := kustomizationMaps[resourcesMap][resourceFile]; !ok {\n\t\t\tparent.Resources = append(parent.Resources, resourceFile)\n\t\t\tkustomizationMaps[resourcesMap][resourceFile] = true\n\t\t}\n\t}\n\tfor _, value := range child.Images {\n\t\timageName := value.Name\n\t\tif _, ok := kustomizationMaps[imagesMap][imageName]; !ok {\n\t\t\tparent.Images = append(parent.Images, value)\n\t\t\tkustomizationMaps[imagesMap][imageName] = true\n\t\t} else {\n\t\t\tkFile := filepath.Join(targetDir, kftypesv3.KustomizationFile)\n\t\t\tlog.Warnf(\"Ignoring image %v specified in %v\", imageName, kFile)\n\t\t}\n\t}\n\tfor _, value := range child.Crds {\n\t\tif _, ok := kustomizationMaps[crdsMap][value]; !ok {\n\t\t\tparent.Crds = append(parent.Crds, value)\n\t\t\tkustomizationMaps[crdsMap][value] = true\n\t\t} else {\n\t\t\tkFile := filepath.Join(targetDir, kftypesv3.KustomizationFile)\n\t\t\tlog.Warnf(\"Ignoring crd %v specified in %v\", value, kFile)\n\t\t}\n\t}\n\tfor _, value := range child.ConfigMapGenerator {\n\t\tparentConfigMapArgs := new(types.ConfigMapArgs)\n\t\tupdateConfigMapArgs(parentConfigMapArgs, value)\n\t}\n\tfor _, value := range child.SecretGenerator {\n\t\tsecretName := value.Name\n\t\tsecretBehavior := types.NewGenerationBehavior(value.Behavior)\n\t\tupdateGeneratorArgs(&value.GeneratorArgs, value.GeneratorArgs)\n\t\tswitch secretBehavior {\n\t\tcase types.BehaviorCreate:\n\t\t\tif _, ok := kustomizationMaps[secretsMapGeneratorMap][secretName]; !ok {\n\t\t\t\tparent.SecretGenerator = append(parent.SecretGenerator, value)\n\t\t\t\tkustomizationMaps[secretsMapGeneratorMap][secretName] = true\n\t\t\t}\n\t\tcase types.BehaviorMerge, types.BehaviorReplace:\n\t\t\tparent.SecretGenerator = append(parent.SecretGenerator, value)\n\t\t\tkustomizationMaps[secretsMapGeneratorMap][secretName] = true\n\t\tdefault:\n\t\t\tvalue.Behavior = secretBehavior.String()\n\t\t\tparent.SecretGenerator = append(parent.SecretGenerator, value)\n\t\t\tkustomizationMaps[secretsMapGeneratorMap][secretName] = true\n\t\t}\n\t}\n\tfor _, value := range child.Vars {\n\t\tvarName := value.Name\n\t\tif _, ok := kustomizationMaps[varsMap][varName]; !ok {\n\t\t\tparent.Vars = append(parent.Vars, value)\n\t\t\tkustomizationMaps[varsMap][varName] = true\n\t\t} else {\n\t\t\tkFile := filepath.Join(targetDir, kftypesv3.KustomizationFile)\n\t\t\tlog.Warnf(\"Ignoring var %v specified in %v\", varName, kFile)\n\t\t}\n\t}\n\tfor _, value := range child.PatchesStrategicMerge {\n\t\tpatchAbsoluteFile := filepath.Join(targetDir, string(value))\n\t\tpatchFile := extractSuffix(compDir, patchAbsoluteFile)\n\t\tif _, ok := kustomizationMaps[patchesStrategicMergeMap][patchFile]; !ok {\n\t\t\tpatchFileCasted := types.PatchStrategicMerge(patchFile)\n\t\t\tparent.PatchesStrategicMerge = append(parent.PatchesStrategicMerge, patchFileCasted)\n\t\t\tkustomizationMaps[patchesStrategicMergeMap][patchFile] = true\n\t\t}\n\t}\n\t// json patches are aggregated and merged into local patch files\n\tfor _, value := range child.PatchesJson6902 {\n\t\tpatchJson := new(types.PatchJson6902)\n\t\tpatchJson.Target = value.Target\n\t\tpatchAbsolutePath := filepath.Join(targetDir, value.Path)\n\t\tpatchJson.Path = extractSuffix(compDir, patchAbsolutePath)\n\t\t// patchJson.Path can be used for multiple targets, hence kustomizationMaps key is patchJson.Path+\"-\"+patchJson.Target.Name\"\n\t\tpatchJsonMapKey := patchJson.Path + \"-\" + patchJson.Target.Name\n\t\tif _, ok := kustomizationMaps[patchesJson6902Map][patchJsonMapKey]; !ok {\n\t\t\tparent.PatchesJson6902 = append(parent.PatchesJson6902, *patchJson)\n\t\t\tkustomizationMaps[patchesJson6902Map][patchJsonMapKey] = true\n\t\t}\n\t}\n\tfor _, value := range child.Configurations {\n\t\tconfigurationAbsolutePath := filepath.Join(targetDir, value)\n\t\tconfigurationPath := extractSuffix(compDir, configurationAbsolutePath)\n\t\tif _, ok := kustomizationMaps[configurationsMap][configurationPath]; !ok {\n\t\t\tparent.Configurations = append(parent.Configurations, configurationPath)\n\t\t\tkustomizationMaps[configurationsMap][configurationPath] = true\n\t\t}\n\t}\n\treturn nil\n}\n\n// MergeKustomizations will merge base and all overlay kustomization files into\n// a single kustomization file\nfunc MergeKustomizations(kfDef *kfconfig.KfConfig, compDir string, overlayParams []string, params []kfconfig.NameValue) (*types.Kustomization, error) {\n\tkustomizationMaps := CreateKustomizationMaps()\n\tkustomization := &types.Kustomization{\n\t\tTypeMeta: types.TypeMeta{\n\t\t\tAPIVersion: types.KustomizationVersion,\n\t\t\tKind:       types.KustomizationKind,\n\t\t},\n\t\tBases:                 make([]string, 0),\n\t\tCommonLabels:          make(map[string]string),\n\t\tCommonAnnotations:     make(map[string]string),\n\t\tPatchesStrategicMerge: make([]types.PatchStrategicMerge, 0),\n\t\tPatchesJson6902:       make([]types.PatchJson6902, 0),\n\t\tImages:                make([]image.Image, 0),\n\t\tVars:                  make([]types.Var, 0),\n\t\tCrds:                  make([]string, 0),\n\t\tResources:             make([]string, 0),\n\t\tConfigMapGenerator:    make([]types.ConfigMapArgs, 0),\n\t\tSecretGenerator:       make([]types.SecretArgs, 0),\n\t\tConfigurations:        make([]string, 0),\n\t}\n\tbaseDir := path.Join(compDir, \"base\")\n\tbase := GetKustomization(baseDir)\n\tif base == nil {\n\t\tcomp := GetKustomization(compDir)\n\t\tif comp != nil {\n\t\t\treturn comp, nil\n\t\t}\n\t} else {\n\t\terr := MergeKustomization(compDir, baseDir, kfDef, params, kustomization, base, kustomizationMaps)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"error merging kustomization at %v: %v\", baseDir, err),\n\t\t\t}\n\t\t}\n\t}\n\tif params != nil {\n\t\tfor _, nv := range params {\n\t\t\tname := nv.Name\n\t\t\tswitch name {\n\t\t\tcase \"namespace\":\n\t\t\t\tkustomization.Namespace = nv.Value\n\t\t\t}\n\t\t}\n\t}\n\tfor _, overlayParam := range overlayParams {\n\t\toverlayDir := path.Join(compDir, \"overlays\", overlayParam)\n\t\tif _, err := os.Stat(overlayDir); err == nil {\n\t\t\terr := MergeKustomization(compDir, overlayDir, kfDef, params, kustomization,\n\t\t\t\tGetKustomization(overlayDir), kustomizationMaps)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"error merging kustomization at %v: %v\", overlayDir, err),\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"no overlay %v for component at %v: %v\", overlayParam, compDir, err),\n\t\t\t}\n\t\t}\n\t}\n\tif len(kustomization.PatchesJson6902) > 0 {\n\t\tpatches := map[string][]types.PatchJson6902{}\n\t\tfor _, jsonPatch := range kustomization.PatchesJson6902 {\n\t\t\tkey := jsonPatch.Target.Name + \"-\" + jsonPatch.Target.Kind\n\t\t\tif _, exists := patches[key]; !exists {\n\t\t\t\tpatchArray := make([]types.PatchJson6902, 0)\n\t\t\t\tpatchArray = append(patchArray, jsonPatch)\n\t\t\t\tpatches[key] = patchArray\n\t\t\t} else {\n\t\t\t\tpatches[key] = append(patches[key], jsonPatch)\n\t\t\t}\n\t\t}\n\t\tkustomization.PatchesJson6902 = make([]types.PatchJson6902, 0)\n\t\tpatchFile := \"\"\n\t\tfor key, values := range patches {\n\t\t\taggregatedPatch := new(types.PatchJson6902)\n\t\t\taggregatedPatch.Path = key + \".yaml\"\n\t\t\tpatchFile = path.Join(compDir, aggregatedPatch.Path)\n\t\t\taggregatedPatch.Target = new(types.PatchTarget)\n\t\t\taggregatedPatch.Target.Name = values[0].Target.Name\n\t\t\taggregatedPatch.Target.Namespace = values[0].Target.Namespace\n\t\t\taggregatedPatch.Target.Group = values[0].Target.Group\n\t\t\taggregatedPatch.Target.Version = values[0].Target.Version\n\t\t\taggregatedPatch.Target.Kind = values[0].Target.Kind\n\t\t\taggregatedPatch.Target.Gvk = values[0].Target.Gvk\n\t\t\tfor _, eachPatch := range values {\n\t\t\t\tpatchPath := path.Join(compDir, eachPatch.Path)\n\t\t\t\tif _, err := os.Stat(patchPath); err == nil {\n\t\t\t\t\tdata, err := ioutil.ReadFile(patchPath)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tf, patchErr := os.OpenFile(patchFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)\n\t\t\t\t\tif patchErr != nil {\n\t\t\t\t\t\treturn nil, patchErr\n\t\t\t\t\t}\n\t\t\t\t\tif _, err := f.Write(data); err != nil {\n\t\t\t\t\t\tf.Close()\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tif err := f.Close(); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tkustomization.PatchesJson6902 = append(kustomization.PatchesJson6902, *aggregatedPatch)\n\t\t}\n\t}\n\treturn kustomization, nil\n}\n\n// GenerateKustomizationFile will create a kustomization.yaml\n// It will parse a args structure that provides mixin or multiple overlays to be merged with the base kustomization file\n// for example\n//\n//   componentParams:\n//    tf-job-operator:\n//    - name: overlay\n//      value: namespaced-gangscheduled\n//\n// TODO(https://github.com/kubeflow/kubeflow/issues/3491): As part of fixing the discovery\n// logic we should change the KfDef spec to provide a list of applications (not a map).\n// and preserve order when applying them so we can get rid of the logic hard-coding\n// moving some applications to the front.\n//\n// TODO(jlewi): Why is the path split between root and compPath?\n// TODO(jlewi): Why is this taking kfDef and writing kfDef? Is this because it is reordering components?\n// TODO(jlewi): This function appears to special case handling of using kustomize\n// for KfDef. Presumably this is because of the code in coordinator which is using it to generate\n// KfDef from overlays. But this function is also used to generate the manifests for the individual\n// kustomize packages.\nfunc GenerateKustomizationFile(kfDef *kfconfig.KfConfig, root string,\n\tcompPath string, overlays []string, params []kfconfig.NameValue) error {\n\n\tmoveToFront := func(item string, list []string) []string {\n\t\tolen := len(list)\n\t\tnewlist := make([]string, 0)\n\t\tfor i, component := range list {\n\t\t\tif component == item {\n\t\t\t\tnewlist = append(newlist, list[i])\n\t\t\t\tnewlist = append(newlist, list[0:i]...)\n\t\t\t\tnewlist = append(newlist, list[i+1:olen]...)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\treturn newlist\n\t}\n\tcompDir := path.Join(root, compPath)\n\tkustomization, kustomizationErr := MergeKustomizations(kfDef, compDir, overlays, params)\n\tif kustomizationErr != nil {\n\t\treturn kustomizationErr\n\t}\n\tif kustomization.Namespace == \"\" {\n\t\tkustomization.Namespace = kfDef.Namespace\n\t}\n\t//TODO(#2685) we may want to delegate this to separate tooling so kfctl is not dynamically mixing in overlays.\n\tif len(kustomization.PatchesStrategicMerge) > 0 {\n\t\tbasename := filepath.Base(string(kustomization.PatchesStrategicMerge[0]))\n\t\tbasefile := filepath.Join(compDir, \"base\", basename)\n\t\tdef, err := ReadUnstructured(basefile)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tapiVersion := def.GetAPIVersion()\n\t\tif apiVersion == kfDef.APIVersion {\n\t\t\t// This code is only invoked when using Kustomize to generate the KFDef spec.\n\t\t\tbaseKfDef := ReadKfDef(basefile)\n\t\t\tfor _, k := range kustomization.PatchesStrategicMerge {\n\t\t\t\toverlayfile := filepath.Join(compDir, string(k))\n\t\t\t\toverlay := ReadKfDef(overlayfile)\n\t\t\t\tmergeErr := mergo.Merge(&baseKfDef.Spec, overlay.Spec, mergo.WithAppendSlice)\n\t\t\t\tif mergeErr != nil {\n\t\t\t\t\treturn mergeErr\n\t\t\t\t}\n\t\t\t}\n\t\t\t//TODO look at sort options\n\t\t\t//See https://github.com/kubernetes-sigs/kustomize/issues/821\n\t\t\t//TODO upgrade to v2.0.4 when available\n\t\t\tbaseKfDef.Spec.Components = moveToFront(\"application\", baseKfDef.Spec.Components)\n\t\t\tbaseKfDef.Spec.Components = moveToFront(\"application-crds\", baseKfDef.Spec.Components)\n\t\t\tbaseKfDef.Spec.Components = moveToFront(\"istio\", baseKfDef.Spec.Components)\n\t\t\tbaseKfDef.Spec.Components = moveToFront(\"istio-install\", baseKfDef.Spec.Components)\n\t\t\tbaseKfDef.Spec.Components = moveToFront(\"istio-crds\", baseKfDef.Spec.Components)\n\t\t\twriteErr := WriteKfDef(baseKfDef, basefile)\n\t\t\tif writeErr != nil {\n\t\t\t\treturn writeErr\n\t\t\t}\n\t\t\tkustomization.PatchesStrategicMerge = nil\n\t\t}\n\t}\n\tbuf, bufErr := yaml.Marshal(kustomization)\n\tif bufErr != nil {\n\t\treturn bufErr\n\t}\n\tkustomizationPath := filepath.Join(compDir, kftypesv3.KustomizationFile)\n\tkustomizationPathErr := ioutil.WriteFile(kustomizationPath, buf, 0644)\n\treturn kustomizationPathErr\n}\n\n// EvaluateKustomizeManifest evaluates the kustomize dir compDir, and returns the resources.\nfunc EvaluateKustomizeManifest(compDir string) (resmap.ResMap, error) {\n\tfsys := fs.MakeRealFS()\n\t// We don't enforce the security check because our kustomize packages are such that kustomization.yaml\n\t// files may refer to patches and resources that are not in the current directory or below them.\n\t// See http://bit.ly/kf_kustomize_v3\n\tlrc := loader.RestrictionNone\n\tldr, err := loader.NewLoader(lrc, validators.MakeFakeValidator(), compDir, fsys)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer ldr.Cleanup()\n\trf := resmap.NewFactory(resource.NewFactory(kunstruct.NewKunstructuredFactoryImpl()), transformer.NewFactoryImpl())\n\tpc := plugins.DefaultPluginConfig()\n\tkt, err := target.NewKustTarget(ldr, rf, transformer.NewFactoryImpl(), plugins.NewLoader(pc, rf))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tallResources, err := kt.MakeCustomizedResMap()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = builtin.NewLegacyOrderTransformerPlugin().Transform(allResources)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn allResources, nil\n}\n\nfunc WriteKustomizationFile(name string, kustomizeDir string, resMap resmap.ResMap) error {\n\n\t// Output the objects.\n\n\tyamlResources, yamlResourcesErr := resMap.AsYaml()\n\tif yamlResourcesErr != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error generating yaml: %v\", yamlResourcesErr),\n\t\t}\n\t}\n\tkustomizeFile := filepath.Join(kustomizeDir, name+\".yaml\")\n\tkustomizationFileErr := ioutil.WriteFile(kustomizeFile, yamlResources, 0644)\n\tif kustomizationFileErr != nil {\n\t\treturn &kfapisv3.KfError{\n\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error writing to %v: %v\", kustomizeFile, kustomizationFileErr),\n\t\t}\n\t}\n\treturn nil\n}\n\n// readLines reads a file into an array of strings\nfunc readLines(path string) ([]string, error) {\n\tvar file, err = os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer file.Close()\n\n\tvar lines []string\n\tscanner := bufio.NewScanner(file)\n\tfor scanner.Scan() {\n\t\tlines = append(lines, scanner.Text())\n\t}\n\treturn lines, scanner.Err()\n}\n\n// writeLines writes a string array to the given file - one line per array entry.\nfunc writeLines(lines []string, path string) error {\n\tfile, err := os.Create(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer file.Close()\n\n\tw := bufio.NewWriter(file)\n\tfor _, line := range lines {\n\t\tfmt.Fprintln(w, line)\n\t}\n\treturn w.Flush()\n}\n\n// extractSuffix will return the non-overlapped part of 2 paths eg\n// /foo/bar/baz/zed and /foo/bar/ will return baz/zed\nfunc extractSuffix(dirPath string, subDirPath string) string {\n\tsuffix := strings.TrimPrefix(subDirPath, dirPath)[1:]\n\treturn suffix\n}\n\nfunc CreateKustomizationMaps() map[MapType]map[string]bool {\n\treturn map[MapType]map[string]bool{\n\t\tbasesMap:                 make(map[string]bool),\n\t\tcommonAnnotationsMap:     make(map[string]bool),\n\t\tcommonLabelsMap:          make(map[string]bool),\n\t\timagesMap:                make(map[string]bool),\n\t\tresourcesMap:             make(map[string]bool),\n\t\tcrdsMap:                  make(map[string]bool),\n\t\tvarsMap:                  make(map[string]bool),\n\t\tconfigurationsMap:        make(map[string]bool),\n\t\tconfigMapGeneratorMap:    make(map[string]bool),\n\t\tsecretsMapGeneratorMap:   make(map[string]bool),\n\t\tpatchesStrategicMergeMap: make(map[string]bool),\n\t\tpatchesJson6902Map:       make(map[string]bool),\n\t}\n}\n\n// GenerateYamlWithOperatorAnnotation adds operator info to the annotation to every resource\n// some code copied from ResMap.AsYaml() func\nfunc GenerateYamlWithOperatorAnnotation(resMap resmap.ResMap, instance *unstructured.Unstructured) ([]byte, error) {\n\tfirstObj := true\n\tvar b []byte\n\tbuf := bytes.NewBuffer(b)\n\tfor _, res := range resMap.Resources() {\n\t\ty, err := res.AsYAML()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tm := &unstructured.Unstructured{}\n\t\tif err = yaml.Unmarshal(y, m); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tanns := m.GetAnnotations()\n\t\tif anns == nil {\n\t\t\tanns = map[string]string{}\n\t\t}\n\t\tkfdefAnn := strings.Join([]string{utils.KfDefAnnotation, utils.KfDefInstance}, \"/\")\n\t\tkfdefCr := strings.Join([]string{instance.GetName(), instance.GetNamespace()}, \".\")\n\n\t\taddAnnotation := true\n\t\tif m.GetKind() == \"Namespace\" {\n\t\t\tconfig, _ := rest.InClusterConfig()\n\t\t\tcorev1client, err := corev1.NewForConfig(config)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, &kfapisv3.KfError{\n\t\t\t\t\tCode:    int(kfapisv3.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"failed to create corev1 client: %v\", err),\n\t\t\t\t}\n\t\t\t}\n\t\t\tns, err := corev1client.Namespaces().Get(m.GetName(), metav1.GetOptions{})\n\t\t\tif err == nil {\n\t\t\t\tlog.Infof(\"Namespace %v already exists.\", m.GetName())\n\n\t\t\t\tnsAnns := ns.GetAnnotations()\n\t\t\t\tif nsAnns == nil {\n\t\t\t\t\taddAnnotation = false\n\t\t\t\t} else {\n\t\t\t\t\t_, found := nsAnns[kfdefAnn]\n\t\t\t\t\tif !found || nsAnns[kfdefAnn] != kfdefCr {\n\t\t\t\t\t\t// if the namespace is not created by this operator, should not append the annotation\n\t\t\t\t\t\taddAnnotation = false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if m.GetKind() == \"CustomResourceDefinition\" && m.GetName() == \"profiles.kubeflow.org\" {\n\t\t\t// profiles will contain user info and data, should not remove during uninstall\n\t\t\taddAnnotation = false\n\t\t}\n\n\t\tif addAnnotation {\n\t\t\tanns[kfdefAnn] = kfdefCr\n\t\t\tm.SetAnnotations(anns)\n\t\t}\n\t\tout, err := yaml.Marshal(m)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif addAnnotation {\n\t\t\tlog.Infof(\"KfDef annotation added for resource %v.%v\", m.GetName(), m.GetNamespace())\n\t\t}\n\n\t\tif firstObj {\n\t\t\tfirstObj = false\n\t\t} else {\n\t\t\tif _, err = buf.WriteString(\"---\\n\"); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tif _, err = buf.Write(out); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn buf.Bytes(), nil\n}\n"
  },
  {
    "path": "pkg/kfapp/kustomize/kustomize_test.go",
    "content": "package kustomize\n\nimport (\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/types\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/otiai10/copy\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n)\n\n// This test tests that GenerateKustomizationFile will produce correct kustomization.yaml\nfunc TestGenerateKustomizationFile(t *testing.T) {\n\ttype testCase struct {\n\t\tkfDef  *kfconfig.KfConfig\n\t\tparams []kfconfig.NameValue\n\t\t// The directory of a (testing) kustomize package\n\t\tpackageDir string\n\t\toverlays   []string\n\t\t// Expected kustomization.yaml\n\t\texpectedFile string\n\t}\n\ttestCases := []testCase{\n\t\t{\n\t\t\tkfDef: &kfconfig.KfConfig{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tNamespace: \"kubeflow\",\n\t\t\t\t},\n\t\t\t\tSpec: kfconfig.KfConfigSpec{},\n\t\t\t},\n\t\t\toverlays: []string{\n\t\t\t\t\"application\",\n\t\t\t},\n\t\t\tpackageDir:   \"testdata/kustomizeExample/pytorch-operator\",\n\t\t\texpectedFile: \"testdata/kustomizeExample/pytorch-operator/expected/kustomization.yaml\",\n\t\t},\n\t\t{\n\t\t\tkfDef: &kfconfig.KfConfig{\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tNamespace: \"kubeflow\",\n\t\t\t\t},\n\t\t\t\tSpec: kfconfig.KfConfigSpec{},\n\t\t\t},\n\t\t\toverlays: []string{\n\t\t\t\t\"istio\",\n\t\t\t\t\"application\",\n\t\t\t\t\"db\",\n\t\t\t},\n\t\t\tpackageDir:   \"testdata/kustomizeExample/metadata\",\n\t\t\texpectedFile: \"testdata/kustomizeExample/metadata/expected/kustomization.yaml\",\n\t\t},\n\t}\n\tpackageName := \"dummy\"\n\tfor _, c := range testCases {\n\t\ttestDir, err := ioutil.TempDir(\"\", \"\")\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create temp dir: %v\", err)\n\t\t}\n\t\tt.Logf(\"testdir: %v\", testDir)\n\t\terr = copy.Copy(c.packageDir, path.Join(testDir, packageName))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to copy package to temp dir: %v\", err)\n\t\t}\n\t\terr = GenerateKustomizationFile(c.kfDef, testDir, packageName, c.overlays, c.params)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to GenerateKustomizationFile: %v\", err)\n\t\t}\n\t\tdata, err := ioutil.ReadFile(path.Join(testDir, packageName, \"kustomization.yaml\"))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to read kustomization.yaml: %v\", err)\n\t\t}\n\t\texpected, err := ioutil.ReadFile(c.expectedFile)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to read expected kustomization.yaml: %v\", err)\n\t\t}\n\n\t\tif diff := cmp.Diff(expected, data); diff != \"\" {\n\t\t\tt.Fatalf(\"kustomization.yaml is different from expected. (-want, +got):\\n%s\", diff)\n\t\t}\n\t}\n}\n\n// TestGenerateYamlWithOperatorAnnotation\nfunc TestGenerateYamlWithOperatorAnnotation(t *testing.T) {\n\ttype testCase struct {\n\t\tappDir   string\n\t\texpected string\n\t}\n\ttestCases := []testCase{\n\t\t{\n\t\t\tappDir:   \"testdata/operator\",\n\t\t\texpected: \"testdata/operator/expected/service.yaml\",\n\t\t},\n\t}\n\tinstance := &unstructured.Unstructured{}\n\tinstance.SetAPIVersion(\"kfdef.apps.kubeflow.org/v1\")\n\tinstance.SetKind(\"KfDef\")\n\tinstance.SetName(\"operator\")\n\tinstance.SetNamespace(\"kubeflow\")\n\n\tfor _, c := range testCases {\n\t\tresMap, err := EvaluateKustomizeManifest(c.appDir)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to evaluate manifest. Error: %v.\", err)\n\t\t}\n\t\tactual, err := GenerateYamlWithOperatorAnnotation(resMap, instance)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to add owner reference. Error: %v.\", err)\n\t\t}\n\t\texpected, err := ioutil.ReadFile(c.expected)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to read expected file. Error: %v\", err)\n\t\t}\n\t\tif diff := cmp.Diff(expected, actual); diff != \"\" {\n\t\t\tt.Fatalf(\"Set operator annotation is different from expected. (-want, +got):\\n%s\", diff)\n\t\t}\n\t}\n}\n\nfunc TestCreateStackAppKustomization(t *testing.T) {\n\ttype testCase struct {\n\t\tName     string\n\t\tInput    *types.Kustomization\n\t\tBasePath string\n\t\tExpected *types.Kustomization\n\t}\n\n\ttestCases := []testCase{\n\t\t{\n\t\t\tName:     \"no-kustomization\",\n\t\t\tInput:    nil,\n\t\t\tBasePath: \"../../.cache/stacks/gcp\",\n\t\t\tExpected: &types.Kustomization{\n\t\t\t\tTypeMeta: types.TypeMeta{\n\t\t\t\t\tAPIVersion: \"kustomize.config.k8s.io/v1beta1\",\n\t\t\t\t\tKind:       \"Kustomization\",\n\t\t\t\t},\n\t\t\t\tResources: []string{\n\t\t\t\t\t\"../../.cache/stacks/gcp\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tName: \"merge-kustomization\",\n\t\t\tInput: &types.Kustomization{\n\t\t\t\tPatchesStrategicMerge: []types.PatchStrategicMerge{\n\t\t\t\t\ttypes.PatchStrategicMerge(\"some-patch.yaml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tBasePath: \"../../.cache/stacks/gcp\",\n\t\t\tExpected: &types.Kustomization{\n\t\t\t\tTypeMeta: types.TypeMeta{\n\t\t\t\t\tAPIVersion: \"kustomize.config.k8s.io/v1beta1\",\n\t\t\t\t\tKind:       \"Kustomization\",\n\t\t\t\t},\n\t\t\t\tResources: []string{\n\t\t\t\t\t\"../../.cache/stacks/gcp\",\n\t\t\t\t},\n\t\t\t\tPatchesStrategicMerge: []types.PatchStrategicMerge{\n\t\t\t\t\ttypes.PatchStrategicMerge(\"some-patch.yaml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range testCases {\n\t\ttestDir, err := ioutil.TempDir(\"\", \"testCreateStackAppKustomization-\"+c.Name+\"-\")\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create temp dir: %v\", err)\n\t\t}\n\t\tt.Logf(\"testdir: %v\", testDir)\n\n\t\tif c.Input != nil {\n\t\t\tcontents, err := yaml.Marshal(c.Input)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error marshalling input kustomization: error; %v\", err)\n\t\t\t}\n\n\t\t\tif err := ioutil.WriteFile(filepath.Join(testDir, \"kustomization.yaml\"), contents, os.ModePerm); err != nil {\n\t\t\t\tt.Fatalf(\"Error writing kustomization: error; %v\", err)\n\t\t\t}\n\t\t}\n\n\t\tkustomizationFile, err := createStackAppKustomization(testDir, c.BasePath)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create kustomization.yaml for Kubeflow apps stack: %v\", err)\n\t\t}\n\n\t\tdata, err := ioutil.ReadFile(kustomizationFile)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Case %v: Failed to read %v: %v\", c.Name, kustomizationFile, err)\n\t\t}\n\n\t\texpected, err := yaml.Marshal(c.Expected)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to marshal expected value: %v\", err)\n\t\t}\n\n\t\texpectedStr := strings.TrimSpace(string(expected))\n\t\tdataStr := strings.TrimSpace(string(data))\n\n\t\tif diff := cmp.Diff(expectedStr, dataStr); diff != \"\" {\n\t\t\tt.Fatalf(\"kustomization.yaml is different from expected. (-want, +got):\\n%s\", diff)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/doc.go",
    "content": "package testdata\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/grpc-params.env",
    "content": "METADATA_GRPC_SERVICE_HOST=metadata-grpc-service\nMETADATA_GRPC_SERVICE_PORT=8080"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/kustomization.yaml",
    "content": "namePrefix: metadata-\napiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\ncommonLabels:\n  kustomize.component: metadata\nconfigMapGenerator:\n- name: ui-parameters\n  envs:\n  - params.env\n- name: grpc-configmap\n  envs:\n  - grpc-params.env\ngeneratorOptions:\n  # TFX pipelines use metadata-grpc-configmap for finding grpc server host and\n  # port at runtime. Because they don't know the suffix, we have to disable it.\n  disableNameSuffixHash: true\nresources:\n- metadata-deployment.yaml\n- metadata-service.yaml\n- metadata-ui-deployment.yaml\n- metadata-ui-role.yaml\n- metadata-ui-rolebinding.yaml\n- metadata-ui-sa.yaml\n- metadata-ui-service.yaml\n- metadata-envoy-deployment.yaml\n- metadata-envoy-service.yaml\nnamespace: kubeflow\nvars:\n# These vars are used internally for the kustomize package.\n# i.e to substitute values into fields kustomize isn't aware of.\n# The names should be unique enough that we don't get conflicts with other packages\n- name: ui-namespace\n  objref:\n    kind: Service\n    name: ui\n    apiVersion: v1\n  fieldref:\n    fieldpath: metadata.namespace\n- name: ui-clusterDomain\n  objref:\n    kind: ConfigMap\n    name: ui-parameters\n    version: v1\n  fieldref:\n    fieldpath: data.uiClusterDomain\n- name: metadata-service\n  objref:\n    kind: Service\n    name: ui\n    apiVersion: v1\n  fieldref:\n    fieldpath: metadata.name\n- name: metadata-envoy-service\n  objref:\n    kind: Service\n    name: envoy-service\n    apiVersion: v1\n  fieldref:\n    fieldpath: metadata.name\nimages:\n- name: gcr.io/kubeflow-images-public/metadata\n  newName: gcr.io/kubeflow-images-public/metadata\n  newTag: v0.1.11\n- name: gcr.io/tfx-oss-public/ml_metadata_store_server\n  newName: gcr.io/tfx-oss-public/ml_metadata_store_server\n  newTag: v0.21.1\n- name: gcr.io/ml-pipeline/envoy\n  newName: gcr.io/ml-pipeline/envoy\n  newTag: metadata-grpc\n- name: mysql\n  newName: mysql\n  newTag: 8.0.3\n- name: gcr.io/kubeflow-images-public/metadata-frontend\n  newName: gcr.io/kubeflow-images-public/metadata-frontend\n  newTag: v0.1.8\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: deployment\n  labels:\n    component: server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: server\n  template:\n    metadata:\n      labels:\n        component: server\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n    spec:\n      containers:\n      - name: container\n        image: gcr.io/kubeflow-images-public/metadata:v0.1.11\n        command: [\"./server/server\",\n                  \"--http_port=8080\"]\n        ports:\n        - name: backendapi\n          containerPort: 8080\n\n        readinessProbe:\n          httpGet:\n            path: /api/v1alpha1/artifact_types\n            port: backendapi\n            httpHeaders:\n            - name: ContentType\n              value: application/json\n          initialDelaySeconds: 3\n          periodSeconds: 5\n          timeoutSeconds: 2\n\n        livenessProbe:\n          httpGet:\n            path: /api/v1alpha1/artifact_types\n            port: backendapi\n            httpHeaders:\n            - name: ContentType\n              value: application/json\n          initialDelaySeconds: 3\n          periodSeconds: 5\n          timeoutSeconds: 2\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: grpc-deployment\n  labels:\n    component: grpc-server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: grpc-server\n  template:\n    metadata:\n      labels:\n        component: grpc-server\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n    spec:\n      containers:\n        - name: container\n          envFrom:\n          - configMapRef:\n              name: grpc-configmap\n          image: gcr.io/tfx-oss-public/ml_metadata_store_server:v0.21.1\n          command: [\"/bin/metadata_store_server\"]\n          args: [\"--grpc_port=$(METADATA_GRPC_SERVICE_PORT)\"]\n          ports:\n            - name: grpc-backendapi\n              containerPort: 8080 #The value of the port number needs to be in sync with value  specified in grpc-params.env\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-envoy-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: envoy-deployment\n  labels:\n    component: envoy\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: envoy\n  template:\n    metadata:\n      labels:\n        component: envoy\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n    spec:\n      containers:\n      - name: container\n        image: gcr.io/ml-pipeline/envoy:metadata-grpc\n        ports:\n        - name: md-envoy\n          containerPort: 9090\n        - name: envoy-admin\n          containerPort: 9901\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-envoy-service.yaml",
    "content": "kind: Service\napiVersion: v1\nmetadata:\n  labels:\n    app: metadata\n  name: envoy-service\nspec:\n  selector:\n    component: envoy\n  type: ClusterIP\n  ports:\n  - port: 9090\n    protocol: TCP\n    name: md-envoy\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-service.yaml",
    "content": "kind: Service\napiVersion: v1\nmetadata:\n  labels:\n    app: metadata\n  name: service\nspec:\n  selector:\n    component: server\n  type: ClusterIP\n  ports:\n  - port: 8080\n    protocol: TCP\n    name: backendapi\n---\nkind: Service\napiVersion: v1\nmetadata:\n  labels:\n    app: grpc-metadata\n  name: grpc-service\nspec:\n  selector:\n    component: grpc-server\n  type: ClusterIP\n  ports:\n    - port: 8080\n      protocol: TCP\n      name: grpc-backendapi\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-ui-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: ui\n  labels:\n    app: metadata-ui\nspec:\n  selector:\n    matchLabels:\n      app: metadata-ui\n  template:\n    metadata:\n      name: ui\n      labels:\n        app: metadata-ui\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n    spec:\n      containers:\n      - image: gcr.io/kubeflow-images-public/metadata-frontend:v0.1.8\n        imagePullPolicy: IfNotPresent\n        name: metadata-ui\n        ports:\n        - containerPort: 3000\n      serviceAccountName: ui\n\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-ui-role.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: Role\nmetadata:\n  labels:\n    app: metadata-ui\n  name: ui\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - pods\n  - pods/log\n  verbs:\n  - create\n  - get\n  - list\n- apiGroups:\n  - \"kubeflow.org\"\n  resources:\n  - viewers\n  verbs:\n  - create\n  - get\n  - list\n  - watch\n  - delete\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-ui-rolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: RoleBinding\nmetadata:\n  labels:\n    app: metadata-ui\n  name: ui\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: Role\n  name: ui\nsubjects:\n- kind: ServiceAccount\n  name: ui\n  namespace: kubeflow\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-ui-sa.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: ui\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/metadata-ui-service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: ui\n  labels:\n    app: metadata-ui\nspec:\n  ports:\n  - port: 80\n    targetPort: 3000\n  selector:\n    app: metadata-ui\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/base/params.env",
    "content": "uiClusterDomain=cluster.local\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/expected/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nbases:\n- base\ncommonLabels:\n  app.kubernetes.io/component: metadata\n  app.kubernetes.io/name: metadata\n  kustomize.component: metadata\nconfigMapGenerator:\n- behavior: unspecified\n  envs:\n  - overlays/db/params.env\n  name: metadata-db-parameters\nconfigurations:\n- overlays/istio/params.yaml\ngeneratorOptions:\n  disableNameSuffixHash: true\nimages:\n- name: mysql\n  newName: mysql\n  newTag: 8.0.3\nkind: Kustomization\nnamespace: kubeflow\npatchesStrategicMerge:\n- overlays/db/metadata-deployment.yaml\nresources:\n- overlays/istio/virtual-service.yaml\n- overlays/istio/virtual-service-metadata-grpc.yaml\n- overlays/application/application.yaml\n- overlays/db/metadata-db-pvc.yaml\n- overlays/db/metadata-db-deployment.yaml\n- overlays/db/metadata-db-service.yaml\nsecretGenerator:\n- behavior: unspecified\n  envs:\n  - overlays/db/secrets.env\n  name: metadata-db-secrets\nvars:\n- fieldref:\n    fieldPath: metadata.name\n  name: metadata-db-service\n  objref:\n    apiVersion: v1\n    kind: Service\n    name: metadata-db\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/application/application.yaml",
    "content": "apiVersion: app.k8s.io/v1beta1\nkind: Application\nmetadata:\n  name: metadata\nspec:\n  addOwnerRef: true\n  componentKinds:\n  - group: core\n    kind: Service\n  - group: apps\n    kind: Deployment\n  - group: core\n    kind: ConfigMap\n  - group: core\n    kind: ServiceAccount\n  descriptor:\n    description: Tracking and managing metadata of machine learning workflows in Kubeflow.\n    keywords:\n    - metadata\n    links:\n    - description: Docs\n      url: https://www.kubeflow.org/docs/components/misc/metadata/\n    maintainers:\n    - email: zhenghui@google.com\n      name: Zhenghui Wang\n    owners:\n    - email: ajaygopinathan@google.com\n      name: Ajay Gopinathan\n    - email: zhenghui@google.com\n      name: Zhenghui Wang\n    type: metadata\n    version: alpha\n  selector:\n    matchLabels:\n      app.kubernetes.io/component: metadata\n      app.kubernetes.io/instance: metadata-0.2.1\n      app.kubernetes.io/managed-by: kfctl\n      app.kubernetes.io/name: metadata\n      app.kubernetes.io/part-of: kubeflow\n      app.kubernetes.io/version: 0.2.1\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/application/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nbases:\n- ../../base\ncommonLabels:\n  app.kubernetes.io/component: metadata\n  app.kubernetes.io/name: metadata\nkind: Kustomization\nresources:\n- application.yaml\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/db/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\ncommonLabels:\n  kustomize.component: metadata\nnamespace: kubeflow\ngeneratorOptions:\n  # name suffix hash is not propagated correctly to base resources\n  disableNameSuffixHash: true\nconfigMapGenerator:\n- name: metadata-db-parameters\n  envs:\n  - params.env\nsecretGenerator:\n- name: metadata-db-secrets\n  envs:\n  - secrets.env\nbases:\n- ../../base\nresources:\n- metadata-db-pvc.yaml\n- metadata-db-deployment.yaml\n- metadata-db-service.yaml\npatchesStrategicMerge:\n- metadata-deployment.yaml\nimages:\n- name: mysql\n  newName: mysql\n  newTag: 8.0.3\nvars:\n- name: metadata-db-service\n  objref:\n    kind: Service\n    name: metadata-db\n    apiVersion: v1\n  fieldref:\n    fieldpath: metadata.name"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/db/metadata-db-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: metadata-db\n  labels:\n    component: db\nspec:\n  selector:\n    matchLabels:\n      component: db\n  replicas: 1\n  template:\n    metadata:\n      name: db\n      labels:\n        component: db\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n    spec:\n      containers:\n      - name: db-container\n        image: mysql:8.0.3\n        args:\n        - --datadir\n        - /var/lib/mysql/datadir\n        envFrom:\n        - configMapRef:\n            name: metadata-db-parameters\n        - secretRef:\n            name: metadata-db-secrets\n        ports:\n        - name: dbapi\n          containerPort: 3306\n        readinessProbe:\n          exec:\n            command:\n            - \"/bin/bash\"\n            - \"-c\"\n            - \"mysql -D $$MYSQL_DATABASE -p$$MYSQL_ROOT_PASSWORD -e 'SELECT 1'\"\n          initialDelaySeconds: 5\n          periodSeconds: 2\n          timeoutSeconds: 1\n        volumeMounts:\n        - name: metadata-mysql\n          mountPath: /var/lib/mysql\n      volumes:\n      - name: metadata-mysql\n        persistentVolumeClaim:\n          claimName: metadata-mysql\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/db/metadata-db-pvc.yaml",
    "content": "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: metadata-mysql\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 10Gi\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/db/metadata-db-service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: metadata-db\n  labels:\n    component: db\nspec:\n  type: ClusterIP\n  ports:\n    - port: 3306\n      protocol: TCP\n      name: dbapi\n  selector:\n    component: db\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/db/metadata-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: deployment\n  labels:\n    component: server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: server\n  template:\n    metadata:\n      labels:\n        component: server\n    spec:\n      containers:\n      - name: container\n        envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n          - secretRef:\n              name: metadata-db-secrets\n        command: [\"./server/server\",\n                  \"--http_port=8080\",\n                  \"--mysql_service_host=$(metadata-db-service)\",\n                  \"--mysql_service_port=$(MYSQL_PORT)\",\n                  \"--mysql_service_user=$(MYSQL_USER_NAME)\",\n                  \"--mysql_service_password=$(MYSQL_ROOT_PASSWORD)\",\n                  \"--mlmd_db_name=$(MYSQL_DATABASE)\"]\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: grpc-deployment\n  labels:\n    component: grpc-server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: grpc-server\n  template:\n    metadata:\n      labels:\n        component: grpc-server\n    spec:\n      containers:\n        - name: container\n          envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n          - secretRef:\n              name: metadata-db-secrets\n          - configMapRef:\n              name: grpc-configmap\n          args: [\"--grpc_port=$(METADATA_GRPC_SERVICE_PORT)\",\n                 \"--mysql_config_host=$(metadata-db-service)\",\n                 \"--mysql_config_database=$(MYSQL_DATABASE)\",\n                 \"--mysql_config_port=$(MYSQL_PORT)\",\n                 \"--mysql_config_user=$(MYSQL_USER_NAME)\",\n                 \"--mysql_config_password=$(MYSQL_ROOT_PASSWORD)\"\n          ]\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/db/params.env",
    "content": "MYSQL_DATABASE=metadb\nMYSQL_PORT=3306\nMYSQL_ALLOW_EMPTY_PASSWORD=true"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/db/secrets.env",
    "content": "MYSQL_USER_NAME=root\nMYSQL_ROOT_PASSWORD=test"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/external-mysql/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\ncommonLabels:\n  kustomize.component: metadata\nconfigMapGenerator:\n- name: metadata-db-parameters\n  envs:\n  - params.env\nsecretGenerator:\n- name: metadata-db-secrets\n  envs:\n  - secrets.env\nbases:\n- ../../base\npatchesStrategicMerge:\n- metadata-deployment.yaml"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/external-mysql/metadata-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: deployment\n  labels:\n    component: server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: server\n  template:\n    metadata:\n      labels:\n        component: server\n    spec:\n      containers:\n      - name: container\n        envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n          - secretRef:\n              name: metadata-db-secrets\n        command: [\"./server/server\",\n                  \"--http_port=8080\",\n                  \"--mysql_service_host=$(MYSQL_HOST)\",\n                  \"--mysql_service_port=$(MYSQL_PORT)\",\n                  \"--mysql_service_user=$(MYSQL_USERNAME)\",\n                  \"--mysql_service_password=$(MYSQL_PASSWORD)\",\n                  \"--mlmd_db_name=$(MYSQL_DATABASE)\"]\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: grpc-deployment\n  labels:\n    component: grpc-server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: grpc-server\n  template:\n    metadata:\n      labels:\n        component: grpc-server\n    spec:\n      containers:\n        - name: container\n          envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n          - secretRef:\n              name: metadata-db-secrets\n          - configMapRef:\n              name: grpc-configmap\n          args: [\"--grpc_port=$(METADATA_GRPC_SERVICE_PORT)\",\n                 \"--mysql_config_host=$(MYSQL_HOST)\",\n                 \"--mysql_config_database=$(MYSQL_DATABASE)\",\n                 \"--mysql_config_port=$(MYSQL_PORT)\",\n                 \"--mysql_config_user=$(MYSQL_USERNAME)\",\n                 \"--mysql_config_password=$(MYSQL_PASSWORD)\"\n          ]\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/external-mysql/params.env",
    "content": "MYSQL_HOST=external_host\nMYSQL_DATABASE=metadb\nMYSQL_PORT=3306\nMYSQL_ALLOW_EMPTY_PASSWORD=true"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/external-mysql/secrets.env",
    "content": "MYSQL_USERNAME=root\nMYSQ_PASSWORD=test\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/google-cloudsql/README.md",
    "content": "This directory contains configurations and guidelines on setting up metadata services to connect to a [Google CloudSQL](https://cloud.google.com/sql) instance.\nYou will get all the benefits of using CloudSQL comparing to managing your own MySQL server in a Kubernetes cluster.\n\n#### Prerequisites\n- Install [kustomize](https://github.com/kubernetes-sigs/kustomize) for building Kubernetes configurations.\n- Install [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) for managing workloads on Kubernetes clusters.\n\n#### 0. Remove default metadata services.\nBy default, Metadata component starts a MySQL server in `kubeflow` namespace. Since we are going to deploy metadata services with CloudSQL, you should delete the default services by running\n\n```\nkustomize build metadata/overlays/db | kubectl delete -n kubeflow -f -\n```\n\n#### 1. Create a CloudSQL instance.\n\nIf you don't have an existing one, you need to [create a CloudSQL instance](https://cloud.google.com/sql/docs/mysql/create-instance) of type MySQL in your GCP project.\nIf you want to connect the instance via private IP, you also need to enable the private IP configuration when creating the instance.\n\n#### 2. Create a Kubernetes secret for accessing the CloudSQL instance.\nYou can follow [this guide](https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine#secrets)\nto set up a [service account with permissions](https://cloud.google.com/sql/docs/mysql/sql-proxy#create-service-account) to connect to the instance, download the JSON key file, and name it `credentials.json`.\nYou need to create a secret via command:\n```\nkubectl create secret -n kubeflow generic cloudsql-instance-credentials --from-file <local_path>/credentials.json\n```\nNote that you must name the key file `credentials.json`, because we will later refer to this file name in the deployment configuration.\n\n#### 3. Create a Kubernetes secret for MySQL account and password.\nBesides the service account with permissions, the metadata services also need a MySQL account name and password to be authenticated for accessing databases. Secret is the way how Kubernetes manages sensitive information.\n\nYou need to [create a secret](https://kubernetes.io/docs/concepts/configuration/secret/#creating-your-own-secrets) under `kubeflow` namespace with name `metadata-db-secrets`, containing values of `MYSQL_USERNAME` and `MYSQL_PASSWORD`.\nYou should be able to see the secret after its creation via command:\n```\nkubectl describe secrets -n kubeflow metadata-db-secrets\n\nName:         metadata-db-secrets\nNamespace:    kubeflow\nLabels:       kustomize.component=metadata\nAnnotations:  \nType:         Opaque\n\nData\n====\nMYSQL_PASSWORD:  9 bytes\nMYSQL_USERNAME:  4 bytes\n```\n\n#### 4. Specify the instance connection name.\nChange the value of `MYSQL_INSTANCE` in `params.env` to your CloudSQL instance connection name. The connection name is in the form of `<project-id>:<region>:<instance-id>`.\n\n#### 5. Start metadata services with CloudSQL proxy.\nStart metadata services with CloudSQL proxy sidecar containers via command:\n```\nkustomize build metadata/overlays/google-cloudsql | kubectl apply -n kubeflow -f -\n```\nYou may find the CloudSQL proxy container logs useful to debug connection errors.\n \n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/google-cloudsql/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\ngeneratorOptions:\n  # name suffix hash is not propagated correctly to base resources due to\n  # https://github.com/kubernetes-sigs/kustomize/issues/1301\n  disableNameSuffixHash: true\ncommonLabels:\n  kustomize.component: metadata\nconfigMapGenerator:\n- name: metadata-db-parameters\n  envs:\n  - params.env\nbases:\n- ../../base\npatchesStrategicMerge:\n- metadata-deployment.yaml"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/google-cloudsql/metadata-deployment.yaml",
    "content": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: deployment\n  labels:\n    component: server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: server\n  template:\n    metadata:\n      labels:\n        component: server\n    spec:\n      volumes:\n        - name: cloudsql-instance-credentials\n          secret:\n            secretName: cloudsql-instance-credentials\n      containers:\n      - name: cloudsql-proxy\n        envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n        image: gcr.io/cloudsql-docker/gce-proxy:1.16\n        command: [\"/cloud_sql_proxy\",\n                  \"-instances=$(MYSQL_INSTANCE)=tcp:3306\",\n                  # If running on a VPC, the Cloud SQL proxy can connect via Private IP. See:\n                  # https://cloud.google.com/sql/docs/mysql/private-ip for more info.\n                  # \"-ip_address_types=PRIVATE\",\n                  \"-credential_file=/secrets/cloudsql/credentials.json\"]\n        securityContext:\n          runAsUser: 2  # non-root user\n          allowPrivilegeEscalation: false\n        volumeMounts:\n          - name: cloudsql-instance-credentials\n            mountPath: /secrets/cloudsql\n            readOnly: true\n      - name: container\n        envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n          - secretRef:\n              name: metadata-db-secrets\n        command: [\"./server/server\",\n                  \"--http_port=8080\",\n                  \"--mysql_service_host=$(MYSQL_HOST)\",\n                  \"--mysql_service_port=$(MYSQL_PORT)\",\n                  \"--mysql_service_user=$(MYSQL_USERNAME)\",\n                  \"--mysql_service_password=$(MYSQL_PASSWORD)\",\n                  \"--mlmd_db_name=$(MYSQL_DATABASE)\"]\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: grpc-deployment\n  labels:\n    component: grpc-server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      component: grpc-server\n  template:\n    metadata:\n      labels:\n        component: grpc-server\n    spec:\n      volumes:\n        - name: cloudsql-instance-credentials\n          secret:\n            secretName: cloudsql-instance-credentials\n      containers:\n        - name: container\n          envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n          - secretRef:\n              name: metadata-db-secrets\n          - configMapRef:\n              name: metadata-grpc-configmap\n          args: [\"--grpc_port=$(METADATA_GRPC_SERVICE_PORT)\",\n                 \"--mysql_config_host=$(MYSQL_HOST)\",\n                 \"--mysql_config_database=$(MYSQL_DATABASE)\",\n                 \"--mysql_config_port=$(MYSQL_PORT)\",\n                 \"--mysql_config_user=$(MYSQL_USERNAME)\",\n                 \"--mysql_config_password=$(MYSQL_PASSWORD)\"\n          ]\n        - name: cloudsql-proxy\n          envFrom:\n          - configMapRef:\n              name: metadata-db-parameters\n          image: gcr.io/cloudsql-docker/gce-proxy:1.16\n          command: [\"/cloud_sql_proxy\",\n                    \"-instances=$(MYSQL_INSTANCE)=tcp:3306\",\n                    # If running on a VPC, the Cloud SQL proxy can connect via Private IP. See:\n                    # https://cloud.google.com/sql/docs/mysql/private-ip for more info.\n                    # \"-ip_address_types=PRIVATE\",\n                    \"-credential_file=/secrets/cloudsql/credentials.json\"]\n          securityContext:\n            runAsUser: 2  # non-root user\n            allowPrivilegeEscalation: false\n          volumeMounts:\n            - name: cloudsql-instance-credentials\n              mountPath: /secrets/cloudsql\n              readOnly: true\n          \n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/google-cloudsql/params.env",
    "content": "MYSQL_HOST=127.0.0.1\nMYSQL_DATABASE=metadb\nMYSQL_PORT=3306\nMYSQL_ALLOW_EMPTY_PASSWORD=true\nMYSQL_INSTANCE=your-project:your-region:your-mysql-instance-id"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/ibm-storage-config/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nbases:\n- ../../base\nimages:\n  - name: mysql\n    newTag: \"5.6\"\n    newName: mysql\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/istio/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nbases:\n- ../../base\nresources:\n- virtual-service.yaml\n- virtual-service-metadata-grpc.yaml\nconfigurations:\n- params.yaml\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/istio/params.yaml",
    "content": "varReference:\n- path: spec/http/route/destination/host\n  kind: VirtualService\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/istio/virtual-service-metadata-grpc.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: metadata-grpc\nspec:\n  gateways:\n  - kubeflow-gateway\n  hosts:\n  - '*'\n  http:\n  - match:\n    - uri:\n        prefix: /ml_metadata\n    rewrite:\n      uri: /ml_metadata\n    route:\n    - destination:\n        host: $(metadata-envoy-service).$(ui-namespace).svc.$(ui-clusterDomain)\n        port:\n          number: 9090\n    timeout: 300s\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/metadata/overlays/istio/virtual-service.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: metadata-ui\nspec:\n  gateways:\n  - kubeflow-gateway\n  hosts:\n  - '*'\n  http:\n  - match:\n    - uri:\n        prefix: /metadata\n    rewrite:\n      uri: /metadata\n    route:\n    - destination:\n        host: $(metadata-service).$(ui-namespace).svc.$(ui-clusterDomain)\n        port:\n          number: 80\n    timeout: 300s\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/cluster-role-binding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  labels:\n    app: pytorch-operator\n  name: pytorch-operator\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: pytorch-operator\nsubjects:\n- kind: ServiceAccount\n  name: pytorch-operator\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/cluster-role.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  labels:\n    app: pytorch-operator\n  name: pytorch-operator\nrules:\n- apiGroups:\n  - kubeflow.org\n  resources:\n  - pytorchjobs\n  - pytorchjobs/status\n  verbs:\n  - '*'\n- apiGroups:\n  - apiextensions.k8s.io\n  resources:\n  - customresourcedefinitions\n  verbs:\n  - '*'\n- apiGroups:\n  - storage.k8s.io\n  resources:\n  - storageclasses\n  verbs:\n  - '*'\n- apiGroups:\n  - batch\n  resources:\n  - jobs\n  verbs:\n  - '*'\n- apiGroups:\n  - \"\"\n  resources:\n  - configmaps\n  - pods\n  - services\n  - endpoints\n  - persistentvolumeclaims\n  - events\n  verbs:\n  - '*'\n- apiGroups:\n  - apps\n  - extensions\n  resources:\n  - deployments\n  verbs:\n  - '*'\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/config-map.yaml",
    "content": "apiVersion: v1\ndata:\n  controller_config_file.yaml: |-\n    {\n\n    }\nkind: ConfigMap\nmetadata:\n  name: pytorch-operator-config\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: pytorch-operator\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      name: pytorch-operator\n  template:\n    metadata:\n      labels:\n        name: pytorch-operator\n    spec:\n      containers:\n      - command:\n        - /pytorch-operator.v1\n        - --alsologtostderr\n        - -v=1\n        - --monitoring-port=8443\n        env:\n        - name: MY_POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: MY_POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        image: gcr.io/kubeflow-images-public/pytorch-operator:v0.5.1-5-ge775742\n        name: pytorch-operator\n        volumeMounts:\n        - mountPath: /etc/config\n          name: config-volume\n      serviceAccountName: pytorch-operator\n      volumes:\n      - configMap:\n          name: pytorch-operator-config\n        name: config-volume\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nnamespace: kubeflow\nresources:\n- cluster-role-binding.yaml\n- cluster-role.yaml\n- config-map.yaml\n- deployment.yaml\n- service-account.yaml\n- service.yaml\ncommonLabels:\n  kustomize.component: pytorch-operator\nimages:\n  - name: gcr.io/kubeflow-images-public/pytorch-operator\n    newName: gcr.io/kubeflow-images-public/pytorch-operator\n    #newTag: v0.5.0-7-g6d7ed35\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/params.env",
    "content": "pytorchDefaultImage=null\ndeploymentScope=cluster\ndeploymentNamespace=null\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/service-account.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    app: pytorch-operator\n  name: pytorch-operator\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/base/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  annotations:\n    prometheus.io/path: /metrics\n    prometheus.io/port: \"8443\"\n    prometheus.io/scrape: \"true\"\n  labels:\n    app: pytorch-operator\n  name: pytorch-operator\nspec:\n  ports:\n  - name: monitoring-port\n    port: 8443\n    targetPort: 8443\n  selector:\n    name: pytorch-operator\n  type: ClusterIP\n\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/expected/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nbases:\n- base\ncommonLabels:\n  app.kubernetes.io/component: pytorch\n  app.kubernetes.io/instance: pytorch-operator\n  app.kubernetes.io/managed-by: kfctl\n  app.kubernetes.io/name: pytorch-operator-application\n  app.kubernetes.io/part-of: kubeflow\n  app.kubernetes.io/version: v0.6.0\nkind: Kustomization\nnamespace: kubeflow\nresources:\n- overlays/application/application.yaml\nsecretGenerator:\n- behavior: unspecified\n  env: overlays/application/secrets.env\n  name: secrets-are-no-fun\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/overlays/application/application.yaml",
    "content": "apiVersion: app.k8s.io/v1beta1\nkind: Application\nmetadata:\n  name: pytorch-operator-application\nspec:\n  type: pytorch-operator\n  componentKinds:\n  - group: core\n    kind: ConfigMap\n  - group: apps\n    kind: Deployment\n  - group: core\n    kind: ServiceAccount\n  description: pytorch-operator allows users to create a custom resource \\\"PyTorchJob\\\".\n  keywords:\n   - pytorch-job\n   - pytorch-operator\n  version: v1alpha1\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/kustomizeExample/pytorch-operator/overlays/application/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nbases:\n- ../../base\nresources:\n- application.yaml\ncommonLabels:\n  app.kubernetes.io/name: pytorch-operator-application\n  app.kubernetes.io/instance: pytorch-operator\n  app.kubernetes.io/version: v0.6.0\n  app.kubernetes.io/component: pytorch\n  app.kubernetes.io/part-of: kubeflow\n  app.kubernetes.io/managed-by: kfctl\nsecretGenerator:\n- name: secrets-are-no-fun\n  env: secrets.env\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/operator/base/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\ncommonLabels:\n  app: fake\nresources:\n- service.yaml\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/operator/base/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: fake-service\nspec:\n  ports:\n  - port: 9000\n    protocol: TCP\n    targetPort: 9000\n  selector:\n    app: fake\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/operator/expected/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  annotations:\n    kfctl.kubeflow.io/kfdef-instance: operator.kubeflow\n  labels:\n    app: fake\n  name: fake-service\n  namespace: kubeflow\nspec:\n  ports:\n  - port: 9000\n    protocol: TCP\n    targetPort: 9000\n  selector:\n    app: fake\n"
  },
  {
    "path": "pkg/kfapp/kustomize/testdata/operator/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nbases:\n- base\nkind: Kustomization\nnamespace: kubeflow\n"
  },
  {
    "path": "pkg/kfapp/minikube/minikube.go",
    "content": "/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage minikube\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ghodss/yaml\"\n\n\t//\"github.com/kubeflow/kfctl/v3/config\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\n\t//kfdefs \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n\t\"io/ioutil\"\n\n\t\"k8s.io/client-go/rest\"\n\tclientcmdapi \"k8s.io/client-go/tools/clientcmd/api\"\n\n\t//\"os/user\"\n\t\"path/filepath\"\n\t//\"strconv\"\n\t//\"strings\"\n)\n\n// Minikube implements KfApp Interface\ntype Minikube struct {\n\tkfconfig.KfConfig\n}\n\nfunc Getplatform(kfdef *kfconfig.KfConfig) kftypes.Platform {\n\t_minikube := &Minikube{\n\t\tKfConfig: *kfdef,\n\t}\n\treturn _minikube\n}\n\n// GetK8sConfig return nil; minikube will use default kube config file\nfunc (minikube *Minikube) GetK8sConfig() (*rest.Config, *clientcmdapi.Config) {\n\treturn nil, nil\n}\n\nfunc (minikube *Minikube) Apply(resources kftypes.ResourceEnum) error {\n\t//mount_local_fs\n\t//setup_tunnels\n\treturn nil\n}\n\nfunc (minikube *Minikube) Delete(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (minikube *Minikube) Dump(resources kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (minikube *Minikube) generate() error {\n\t// TODO: fix with applications\n\n\t// remove Katib package and component\n\t// minikube.Spec.Packages = kftypes.RemoveItem(minikube.Spec.Packages, \"katib\")\n\t// minikube.Spec.Components = kftypes.RemoveItem(minikube.Spec.Components, \"katib\")\n\t// minikube.Spec.ComponentParams[\"application\"] = []config.NameValue{\n\t// \t{\n\t// \t\tName:  \"components\",\n\t// \t\tValue: \"[\" + strings.Join(kftypes.QuoteItems(minikube.Spec.Components), \",\") + \"]\",\n\t// \t},\n\t// }\n\t// usr, err := user.Current()\n\t// if err != nil {\n\t// \treturn &kfapis.KfError{\n\t// \t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t// \t\tMessage: fmt.Sprintf(\"Could not get current user; error %v\", err),\n\t// \t}\n\t// }\n\t// uid := usr.Uid\n\t// gid := usr.Gid\n\t// minikube.Spec.ComponentParams[\"jupyter\"] = []config.NameValue{\n\t// \t{\n\t// \t\tName:  string(kftypes.PLATFORM),\n\t// \t\tValue: minikube.Spec.Platform,\n\t// \t},\n\t// \t{\n\t// \t\tName:  \"accessLocalFs\",\n\t// \t\tValue: strconv.FormatBool(minikube.Spec.MountLocal),\n\t// \t},\n\t// \t{\n\t// \t\tName:  \"disks\",\n\t// \t\tValue: \"local-notebooks\",\n\t// \t},\n\t// \t{\n\t// \t\tName:  \"notebookUid\",\n\t// \t\tValue: uid,\n\t// \t},\n\t// \t{\n\t// \t\tName:  \"notebookGid\",\n\t// \t\tValue: gid,\n\t// \t},\n\t// }\n\t// minikube.Spec.ComponentParams[\"ambassador\"] = []config.NameValue{\n\t// \t{\n\t// \t\tName:  string(kftypes.PLATFORM),\n\t// \t\tValue: minikube.Spec.Platform,\n\t// \t},\n\t// \t{\n\t// \t\tName:  \"replicas\",\n\t// \t\tValue: \"1\",\n\t// \t},\n\t// }\n\treturn nil\n}\n\nfunc (minikube *Minikube) Generate(resources kftypes.ResourceEnum) error {\n\tswitch resources {\n\tcase kftypes.K8S:\n\tcase kftypes.ALL:\n\t\tfallthrough\n\tcase kftypes.PLATFORM:\n\t\tgenerateErr := minikube.generate()\n\t\tif generateErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"minikube generate failed Error: %v\", generateErr),\n\t\t\t}\n\t\t}\n\t}\n\tcreateConfigErr := minikube.writeConfigFile()\n\tif createConfigErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"cannot create config file app.yaml in %v\", minikube.KfConfig.Spec.AppDir),\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (minikube *Minikube) Init(kftypes.ResourceEnum) error {\n\treturn nil\n}\n\nfunc (minikube *Minikube) writeConfigFile() error {\n\tbuf, bufErr := yaml.Marshal(minikube.KfConfig)\n\tif bufErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"cannot marshal config file: %v\", bufErr),\n\t\t}\n\t}\n\tcfgFilePath := filepath.Join(minikube.KfConfig.Spec.AppDir, kftypes.KfConfigFile)\n\tcfgFilePathErr := ioutil.WriteFile(cfgFilePath, buf, 0644)\n\tif cfgFilePathErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"cannot write config file: %v\", cfgFilePathErr),\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfconfig/awsplugin/OWNERS",
    "content": "approvers:\n  - jeffwan\n  - PatrickXYS\n"
  },
  {
    "path": "pkg/kfconfig/awsplugin/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1beta1 contains API Schema definitions for the kfdef v1beta1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig/awsplugin\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=awsplugin.internal.kubeflow.org\n\npackage awsplugin\n"
  },
  {
    "path": "pkg/kfconfig/awsplugin/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the KfAwsPlugin v1alpha1.\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig/awsplugin\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=awsplugin.internal.kubeflow.org\npackage awsplugin\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"awsplugin.internal.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfAwsPlugin{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/kfconfig/awsplugin/types.go",
    "content": "package awsplugin\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// +k8s:openapi-gen=true\n// Placeholder for the plugin API.\ntype KfAwsPlugin struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec AwsPluginSpec `json:\"spec,omitempty\"`\n}\n\n// AwsPlugin defines the extra data provided by the GCP Plugin in KfDef\ntype AwsPluginSpec struct {\n\tAuth *Auth `json:\"auth,omitempty\"`\n\n\tRegion string `json:\"region,omitempty\"`\n\n\tRoles []string `json:\"roles,omitempty\"`\n\n\tEnablePodIamPolicy *bool `json:\"enablePodIamPolicy,omitempty\"`\n\n\tEnableNodeGroupLog *bool `json:\"enableNodeGroupLog,omitempty\"`\n\n\tManagedCluster *bool `json:\"managedCluster,omitempty\"`\n\n\tManagedRelationDatabase *RelationDatabaseConfig `json:\"managedRelationDatabase,omitempty\"`\n\n\tManagedObjectStorage *ObjectStorageConfig `json:\"managedObjectStorage,omitempty\"`\n\n\t// TODO: Addon is used to host some optional aws specific components\n\t// EFS, FSX CSI Plugin, Device Plugin, etc\n\t//AddOns []string `json:\"addons,omitempty\"`\n}\n\ntype RelationDatabaseConfig struct {\n\tHost     string `json:\"host,omitempty\"`\n\tPort     *int   `json:\"port,omitempty\"`\n\tDatabase string `json:\"database,omitempty\"`\n\tUsername string `json:\"username,omitempty\"`\n\tPassword string `json:\"password,omitempty\"`\n}\n\ntype ObjectStorageConfig struct {\n\tEndpoint   string `json:\"endpoint,omitempty\"`\n\tRegion     string `json:\"region,omitempty\"`\n\tBucket     string `json:\"bucket,omitempty\"`\n\tPathPrefix string `json:\"pathPrefix,omitempty\"`\n}\n\ntype Auth struct {\n\tBasicAuth *BasicAuth `json:\"basicAuth,omitempty\"`\n\tOidc      *OIDC      `json:\"oidc,omitempty\"`\n\tCognito   *Coginito  `json:\"cognito,omitempty\"`\n}\n\ntype BasicAuth struct {\n\tUsername string `json:\"username,omitempty\"`\n\tPassword string `json:\"password,omitempty\"`\n}\n\ntype OIDC struct {\n\tOidcAuthorizationEndpoint string `json:\"oidcAuthorizationEndpoint,omitempty\"`\n\tOidcIssuer                string `json:\"oidcIssuer,omitempty\"`\n\tOidcTokenEndpoint         string `json:\"oidcTokenEndpoint,omitempty\"`\n\tOidcUserInfoEndpoint      string `json:\"oidcUserInfoEndpoint,omitempty\"`\n\tCertArn                   string `json:\"certArn,omitempty\"`\n\tOAuthClientId             string `json:\"oAuthClientId,omitempty\"`\n\tOAuthClientSecret         string `json:\"oAuthClientSecret,omitempty\"`\n}\n\ntype Coginito struct {\n\tCognitoAppClientId    string `json:\"cognitoAppClientId,omitempty\"`\n\tCognitoUserPoolArn    string `json:\"cognitoUserPoolArn,omitempty\"`\n\tCognitoUserPoolDomain string `json:\"cognitoUserPoolDomain,omitempty\"`\n\tCertArn               string `json:\"certArn,omitempty\"`\n}\n\n// IsValid returns true if the spec is a valid and complete spec.\n// If false it will also return a string providing a message about why its invalid.\nfunc (plugin *AwsPluginSpec) IsValid() (bool, string) {\n\tif plugin.Auth.BasicAuth != nil {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif plugin.Auth.BasicAuth.Username == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"BasicAuth requires username. \"\n\t\t}\n\n\t\tif plugin.Auth.BasicAuth.Password == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"BasicAuth requires password. \"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\tif plugin.Auth.Oidc != nil {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif plugin.Auth.Oidc.OidcAuthorizationEndpoint == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcAuthorizationEndpoint is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OidcIssuer == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcIssuer is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OidcTokenEndpoint == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcTokenEndpoint is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OidcUserInfoEndpoint == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OidcUserInfoEndpoint is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.CertArn == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CertArn is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OAuthClientId == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OAuthClientId is required\"\n\t\t}\n\n\t\tif plugin.Auth.Oidc.OAuthClientSecret == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"OAuthClientSecret is required\"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\tif plugin.Auth.Cognito != nil {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif plugin.Auth.Cognito.CognitoAppClientId == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CognitoAppClientId is required\"\n\t\t}\n\n\t\tif plugin.Auth.Cognito.CognitoUserPoolArn == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CognitoUserPoolArn is required\"\n\t\t}\n\n\t\tif plugin.Auth.Cognito.CognitoUserPoolDomain == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CognitoUserPoolDomain is required\"\n\t\t}\n\n\t\tif plugin.Auth.Cognito.CertArn == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"CertArn is required\"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\tif plugin.ManagedRelationDatabase != nil {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif plugin.ManagedRelationDatabase.Host == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"ManagedRelationDatabase.Host is required\"\n\t\t}\n\n\t\tif plugin.ManagedRelationDatabase.Username == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"ManagedRelationDatabase.Username is required\"\n\t\t}\n\n\t\tif plugin.ManagedRelationDatabase.Password == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"ManagedRelationDatabase.Password is required\"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\tif plugin.ManagedObjectStorage != nil {\n\t\tmsg := \"\"\n\t\tisValid := true\n\n\t\tif plugin.ManagedObjectStorage.Endpoint == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"ManagedObjectStorage.Endpoint is required\"\n\t\t}\n\n\t\tif plugin.ManagedObjectStorage.Region == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"ManagedObjectStorage.Region is required\"\n\t\t}\n\n\t\tif plugin.ManagedObjectStorage.Bucket == \"\" {\n\t\t\tisValid = false\n\t\t\tmsg += \"ManagedObjectStorage.Bucket is required\"\n\t\t}\n\n\t\treturn isValid, msg\n\t}\n\n\treturn true, \"\"\n}\n\n// GetEnablePodIamPolicy return true if user want to enable pod iam policy\nfunc (p *AwsPluginSpec) GetEnablePodIamPolicy() bool {\n\tif p.EnablePodIamPolicy == nil {\n\t\treturn false\n\t}\n\n\tv := p.EnablePodIamPolicy\n\treturn *v\n}\n\n// GetEnableNodeGroupLog return true if user want to enable fluentd cloud watch logs\nfunc (p *AwsPluginSpec) GetEnableNodeGroupLog() bool {\n\tif p.EnableNodeGroupLog == nil {\n\t\treturn false\n\t}\n\n\tv := p.EnableNodeGroupLog\n\treturn *v\n}\n\n// GetManagedCluster return true if user want to create a new cluster and then deploy kubeflow\nfunc (p *AwsPluginSpec) GetManagedCluster() bool {\n\tif p.ManagedCluster == nil {\n\t\treturn false\n\t}\n\n\tv := p.ManagedCluster\n\treturn *v\n}\n"
  },
  {
    "path": "pkg/kfconfig/awsplugin/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage awsplugin\n\nimport (\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Auth) DeepCopyInto(out *Auth) {\n\t*out = *in\n\tif in.BasicAuth != nil {\n\t\tin, out := &in.BasicAuth, &out.BasicAuth\n\t\t*out = new(BasicAuth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.Oidc != nil {\n\t\tin, out := &in.Oidc, &out.Oidc\n\t\t*out = new(OIDC)\n\t\t**out = **in\n\t}\n\tif in.Cognito != nil {\n\t\tin, out := &in.Cognito, &out.Cognito\n\t\t*out = new(Coginito)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Auth.\nfunc (in *Auth) DeepCopy() *Auth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Auth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *AwsPluginSpec) DeepCopyInto(out *AwsPluginSpec) {\n\t*out = *in\n\tif in.Auth != nil {\n\t\tin, out := &in.Auth, &out.Auth\n\t\t*out = new(Auth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.Roles != nil {\n\t\tin, out := &in.Roles, &out.Roles\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.EnablePodIamPolicy != nil {\n\t\tin, out := &in.EnablePodIamPolicy, &out.EnablePodIamPolicy\n\t\t*out = new(bool)\n\t\t**out = **in\n\t}\n\tif in.EnableNodeGroupLog != nil {\n\t\tin, out := &in.EnableNodeGroupLog, &out.EnableNodeGroupLog\n\t\t*out = new(bool)\n\t\t**out = **in\n\t}\n\tif in.ManagedCluster != nil {\n\t\tin, out := &in.ManagedCluster, &out.ManagedCluster\n\t\t*out = new(bool)\n\t\t**out = **in\n\t}\n\tif in.ManagedRelationDatabase != nil {\n\t\tin, out := &in.ManagedRelationDatabase, &out.ManagedRelationDatabase\n\t\t*out = new(RelationDatabaseConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.ManagedObjectStorage != nil {\n\t\tin, out := &in.ManagedObjectStorage, &out.ManagedObjectStorage\n\t\t*out = new(ObjectStorageConfig)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsPluginSpec.\nfunc (in *AwsPluginSpec) DeepCopy() *AwsPluginSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(AwsPluginSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n//DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *BasicAuth) DeepCopyInto(out *BasicAuth) {\n\t*out = *in\n\t//if in.Password != \"\" {\n\t//\tin, out := &in.Password, &out.Password\n\t//\t*out = \"\"\n\t//\t**out = **in\n\t//}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuth.\nfunc (in *BasicAuth) DeepCopy() *BasicAuth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(BasicAuth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Coginito) DeepCopyInto(out *Coginito) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Coginito.\nfunc (in *Coginito) DeepCopy() *Coginito {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Coginito)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfAwsPlugin) DeepCopyInto(out *KfAwsPlugin) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfAwsPlugin.\nfunc (in *KfAwsPlugin) DeepCopy() *KfAwsPlugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfAwsPlugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfAwsPlugin) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *OIDC) DeepCopyInto(out *OIDC) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDC.\nfunc (in *OIDC) DeepCopy() *OIDC {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(OIDC)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *ObjectStorageConfig) DeepCopyInto(out *ObjectStorageConfig) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectStorageConfig.\nfunc (in *ObjectStorageConfig) DeepCopy() *ObjectStorageConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(ObjectStorageConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RelationDatabaseConfig) DeepCopyInto(out *RelationDatabaseConfig) {\n\t*out = *in\n\tif in.Port != nil {\n\t\tin, out := &in.Port, &out.Port\n\t\t*out = new(int)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RelationDatabaseConfig.\nfunc (in *RelationDatabaseConfig) DeepCopy() *RelationDatabaseConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RelationDatabaseConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/kfconfig/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1alpha1 contains API Schema definitions for the kfconfig v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfconfig.apps.kubeflow.org\n\npackage kfconfig\n"
  },
  {
    "path": "pkg/kfconfig/gcpplugin/doc.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// Package v1beta1 contains API Schema definitions for the kfdef v1beta1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig/gcpplugin\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=gcpplugin.internal.kubeflow.org\n\npackage gcpplugin\n"
  },
  {
    "path": "pkg/kfconfig/gcpplugin/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the KfGcpPlugin v1alpha1.\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig/gcpplugin\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=gcpplugin.internal.kubeflow.org\npackage gcpplugin\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"gcpplugin.internal.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfGcpPlugin{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/kfconfig/gcpplugin/types.go",
    "content": "package gcpplugin\n\nimport (\n\t\"fmt\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"strings\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// +k8s:openapi-gen=true\n// Placeholder for the plugin API.\ntype KfGcpPlugin struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec GcpPluginSpec `json:\"spec,omitempty\"`\n}\n\n// GcpPlugin defines the extra data provided by the GCP Plugin in KfDef\ntype GcpPluginSpec struct {\n\tAuth *Auth `json:\"auth,omitempty\"`\n\n\t// SAClientId if supplied grant this service account cluster admin access\n\t// TODO(jlewi): Might want to make it a list\n\tSAClientId string `json:\"username,omitempty\"`\n\n\t// CreatePipelinePersistentStorage indicates whether to create storage.\n\t// Use a pointer so we can distinguish unset values.\n\tCreatePipelinePersistentStorage *bool `json:\"createPipelinePersistentStorage,omitempty\"`\n\n\t// EnableWorkloadIdentity indicates whether to enable workload identity.\n\t// Use a pointer so we can distinguish unset values.\n\tEnableWorkloadIdentity *bool `json:\"enableWorkloadIdentity,omitempty\"`\n\n\t// DeploymentManagerConfig provides location of the deployment manager configs.\n\tDeploymentManagerConfig *DeploymentManagerConfig `json:\"deploymentManagerConfig,omitempty\"`\n\n\tProject         string `json:\"project,omitempty\"`\n\tEmail           string `json:\"email,omitempty\"`\n\tIpName          string `json:\"ipName,omitempty\"`\n\tHostname        string `json:\"hostname,omitempty\"`\n\tZone            string `json:\"zone,omitempty\"`\n\tUseBasicAuth    bool   `json:\"useBasicAuth\"`\n\tSkipInitProject bool   `json:\"skipInitProject,omitempty\"`\n\tDeleteStorage   bool   `json:\"deleteStorage,omitempty\"`\n}\n\ntype Auth struct {\n\tBasicAuth *BasicAuth `json:\"basicAuth,omitempty\"`\n\tIAP       *IAP       `json:\"iap,omitempty\"`\n}\n\ntype BasicAuth struct {\n\tUsername string              `json:\"username,omitempty\"`\n\tPassword *kfconfig.SecretRef `json:\"password,omitempty\"`\n}\n\ntype IAP struct {\n\tOAuthClientId     string              `json:\"oAuthClientId,omitempty\"`\n\tOAuthClientSecret *kfconfig.SecretRef `json:\"oAuthClientSecret,omitempty\"`\n}\n\ntype DeploymentManagerConfig struct {\n\tRepoRef *kfconfig.RepoRef `json:\"repoRef,omitempty\"`\n}\n\n// IsValid returns nil if the spec is a valid and complete spec.\n// If not nil it will return a `KfError` with an error message.\nfunc (s *GcpPluginSpec) IsValid() error {\n\tif len(s.Hostname) > 63 {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Invaid host name: host name %s is longer than 63 characters. Please shorten the metadata.name.\", s.Hostname),\n\t\t}\n\t}\n\tbasicAuthSet := s.Auth.BasicAuth != nil\n\tiapAuthSet := s.Auth.IAP != nil\n\n\tif basicAuthSet == iapAuthSet {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"Exactly one of BasicAuth and IAP must be set; the other should be nil\",\n\t\t}\n\t}\n\n\tif basicAuthSet {\n\t\tmsgs := []string{}\n\t\tif s.Auth.BasicAuth.Username == \"\" {\n\t\t\tmsgs = append(msgs, \"BasicAuth requires username.\")\n\t\t}\n\n\t\tif s.Auth.BasicAuth.Password == nil {\n\t\t\tmsgs = append(msgs, \"BasicAuth requires password.\")\n\t\t}\n\n\t\tif len(msgs) > 0 {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: strings.Join(msgs, \";\"),\n\t\t\t}\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tif iapAuthSet {\n\t\tmsgs := []string{}\n\t\tif s.Auth.IAP.OAuthClientId == \"\" {\n\t\t\tmsgs = append(msgs, \"IAP requires OAuthClientId.\")\n\t\t}\n\n\t\tif s.Auth.IAP.OAuthClientSecret == nil {\n\t\t\tmsgs = append(msgs, \"IAP requires OAuthClientSecret.\")\n\t\t}\n\n\t\tif len(msgs) > 0 {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: strings.Join(msgs, \";\"),\n\t\t\t}\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn &kfapis.KfError{\n\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\tMessage: \"Either BasicAuth or IAP must be set\",\n\t}\n}\n\nfunc (p *GcpPluginSpec) GetCreatePipelinePersistentStorage() bool {\n\tif p.CreatePipelinePersistentStorage == nil {\n\t\treturn true\n\t}\n\n\tv := p.CreatePipelinePersistentStorage\n\treturn *v\n}\n\nfunc (p *GcpPluginSpec) GetEnableWorkloadIdentity() bool {\n\tif p.EnableWorkloadIdentity == nil {\n\t\treturn true\n\t}\n\n\tv := p.EnableWorkloadIdentity\n\treturn *v\n}\n"
  },
  {
    "path": "pkg/kfconfig/gcpplugin/types_test.go",
    "content": "package gcpplugin\n\nimport (\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tkfutils \"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"testing\"\n)\n\nfunc TestGcpPluginSpec_IsValid(t *testing.T) {\n\n\ttype testCase struct {\n\t\tinput    *GcpPluginSpec\n\t\texpected error\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\t// Neither IAP or BasicAuth is set\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{},\n\t\t\t},\n\t\t\texpected: &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t// Both IAP and BasicAuth set\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tUsername: \"jlewi\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientId: \"jlewi\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t},\n\t\t},\n\n\t\t// Validate basic auth.\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tUsername: \"jlewi\",\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tUsername: \"jlewi\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t},\n\t\t},\n\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tBasicAuth: &BasicAuth{\n\t\t\t\t\t\tPassword: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t},\n\t\t},\n\t\t// End Validate basic auth.\n\t\t// End Validate IAP.\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientId: \"jlewi\",\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: nil,\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientId: \"jlewi\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tAuth: &Auth{\n\t\t\t\t\tIAP: &IAP{\n\t\t\t\t\t\tOAuthClientSecret: &kfconfig.SecretRef{\n\t\t\t\t\t\t\tName: \"somesecret\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tinput: &GcpPluginSpec{\n\t\t\t\tHostname: \"this-kfApp-name-is-very-long.endpoints.my-gcp-project-for-kubeflow.cloud.goog\",\n\t\t\t},\n\t\t\texpected: &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\terr := c.input.IsValid()\n\t\tpSpec := kfutils.PrettyPrint(c.input)\n\t\tif err != nil {\n\t\t\tif c.expected != nil {\n\t\t\t\tif err.(*kfapis.KfError).Code != c.expected.(*kfapis.KfError).Code {\n\t\t\t\t\tt.Errorf(\"Spec %v;\\n IsValid Got:%v %v\", pSpec, err, c.expected)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tt.Errorf(\"Spec %v;\\n IsValid Got:%v %v\", pSpec, err, c.expected)\n\t\t\t}\n\t\t} else if c.expected != nil {\n\t\t\tt.Errorf(\"Spec %v;\\n IsValid Got:%v %v\", pSpec, err, c.expected)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/kfconfig/gcpplugin/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage gcpplugin\n\nimport (\n\tkfconfig \"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Auth) DeepCopyInto(out *Auth) {\n\t*out = *in\n\tif in.BasicAuth != nil {\n\t\tin, out := &in.BasicAuth, &out.BasicAuth\n\t\t*out = new(BasicAuth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.IAP != nil {\n\t\tin, out := &in.IAP, &out.IAP\n\t\t*out = new(IAP)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Auth.\nfunc (in *Auth) DeepCopy() *Auth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Auth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *BasicAuth) DeepCopyInto(out *BasicAuth) {\n\t*out = *in\n\tif in.Password != nil {\n\t\tin, out := &in.Password, &out.Password\n\t\t*out = new(kfconfig.SecretRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuth.\nfunc (in *BasicAuth) DeepCopy() *BasicAuth {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(BasicAuth)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *DeploymentManagerConfig) DeepCopyInto(out *DeploymentManagerConfig) {\n\t*out = *in\n\tif in.RepoRef != nil {\n\t\tin, out := &in.RepoRef, &out.RepoRef\n\t\t*out = new(kfconfig.RepoRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentManagerConfig.\nfunc (in *DeploymentManagerConfig) DeepCopy() *DeploymentManagerConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(DeploymentManagerConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *GcpPluginSpec) DeepCopyInto(out *GcpPluginSpec) {\n\t*out = *in\n\tif in.Auth != nil {\n\t\tin, out := &in.Auth, &out.Auth\n\t\t*out = new(Auth)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\tif in.CreatePipelinePersistentStorage != nil {\n\t\tin, out := &in.CreatePipelinePersistentStorage, &out.CreatePipelinePersistentStorage\n\t\t*out = new(bool)\n\t\t**out = **in\n\t}\n\tif in.EnableWorkloadIdentity != nil {\n\t\tin, out := &in.EnableWorkloadIdentity, &out.EnableWorkloadIdentity\n\t\t*out = new(bool)\n\t\t**out = **in\n\t}\n\tif in.DeploymentManagerConfig != nil {\n\t\tin, out := &in.DeploymentManagerConfig, &out.DeploymentManagerConfig\n\t\t*out = new(DeploymentManagerConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GcpPluginSpec.\nfunc (in *GcpPluginSpec) DeepCopy() *GcpPluginSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(GcpPluginSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *IAP) DeepCopyInto(out *IAP) {\n\t*out = *in\n\tif in.OAuthClientSecret != nil {\n\t\tin, out := &in.OAuthClientSecret, &out.OAuthClientSecret\n\t\t*out = new(kfconfig.SecretRef)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IAP.\nfunc (in *IAP) DeepCopy() *IAP {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(IAP)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfGcpPlugin) DeepCopyInto(out *KfGcpPlugin) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfGcpPlugin.\nfunc (in *KfGcpPlugin) DeepCopy() *KfGcpPlugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfGcpPlugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfGcpPlugin) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/loaders.go",
    "content": "package loaders\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"io/ioutil\"\n\tnetUrl \"net/url\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/ghodss/yaml\"\n\tgogetter \"github.com/hashicorp/go-getter\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\ntype Loader interface {\n\tLoadKfConfig(kfdef interface{}) (*kfconfig.KfConfig, error)\n\tLoadKfDef(config kfconfig.KfConfig, out interface{}) error\n}\n\nconst (\n\tApi = \"kfdef.apps.kubeflow.org\"\n)\n\nfunc isValidUrl(toTest string) bool {\n\t_, err := netUrl.ParseRequestURI(toTest)\n\tif err != nil {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}\n}\n\n// LoadConfigFromURI reads the kfdef from a remote URI or local file,\n// and returns the kfconfig.\n// It will set the AppDir and ConfigFilename in kfconfig:\n//   AppDir = cwd if configFile is remote, or it will be the dir of configFile.\n//   ConfigFilename = the file name of configFile.\nfunc LoadConfigFromURI(configFile string) (*kfconfig.KfConfig, error) {\n\tif configFile == \"\" {\n\t\treturn nil, fmt.Errorf(\"config file must be the URI of a KfDef spec\")\n\t}\n\n\tisRemoteFile, err := utils.IsRemoteFile(configFile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// appFile is configFile if configFile is local.\n\t// Otherwise (configFile is remote), appFile points to a downloaded copy of configFile in tmp.\n\tappFile := configFile\n\t// If config is remote, download it to a temp dir.\n\tif isRemoteFile {\n\t\t// TODO(jlewi): We should check if configFile doesn't specify a protocol or the protocol\n\t\t// is file:// then we can just read it rather than fetching with go-getter.\n\t\tappDir, err := ioutil.TempDir(\"\", \"\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Create a temporary directory to copy the file to.\")\n\t\t}\n\t\t// Open config file\n\t\t//\n\t\t// TODO(jlewi): Should we use hashicorp go-getter.GetAny here? We use that to download\n\t\t// the tarballs for the repos. Maybe we should use that here as well to be consistent.\n\t\tappFile = path.Join(appDir, \"tmp_app.yaml\")\n\n\t\tlog.Infof(\"Downloading %v to %v\", configFile, appFile)\n\t\tconfigFileUri, err := netUrl.Parse(configFile)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not parse configFile url\")\n\t\t}\n\t\tif isValidUrl(configFile) {\n\t\t\terrGet := gogetter.GetFile(appFile, configFile)\n\t\t\tif errGet != nil {\n\t\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: fmt.Sprintf(\"could not fetch specified config %s: %v\", configFile, errGet),\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tg := new(gogetter.FileGetter)\n\t\t\tg.Copy = true\n\t\t\terrGet := g.GetFile(appFile, configFileUri)\n\t\t\tif errGet != nil {\n\t\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: fmt.Sprintf(\"could not fetch specified config %s: %v\", configFile, err),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Read contents\n\tconfigFileBytes, err := ioutil.ReadFile(appFile)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not read from config file %s: %v\", configFile, err),\n\t\t}\n\t}\n\n\t// Check API version.\n\tvar obj map[string]interface{}\n\tif err = yaml.Unmarshal(configFileBytes, &obj); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"invalid config file format: %v\", err),\n\t\t}\n\t}\n\tapiVersion, ok := obj[\"apiVersion\"]\n\tif !ok {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"invalid config: apiVersion is not found.\",\n\t\t}\n\t}\n\tapiVersionSeparated := strings.Split(apiVersion.(string), \"/\")\n\tif len(apiVersionSeparated) < 2 || apiVersionSeparated[0] != Api {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"invalid config: apiVersion must be in the format of %v/<version>, got %v\", Api, apiVersion),\n\t\t}\n\t}\n\n\t// Add this check because kfctl binary can not properly install Kubeflow using v1alpha1 configuration.\n\t// See https://github.com/kubeflow/kubeflow/issues/4371.\n\tif apiVersionSeparated[1] == \"v1alpha1\" {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\n\t\t\t\t\"KfDef version v1alpha1 is not supported by this binary. Please use configs at %s for to deploy Kubeflow 0.7 or use old kfctl at %s to deploy Kubeflow 0.6\",\n\t\t\t\t\"https://github.com/kubeflow/manifests/tree/v0.7-branch/kfdef\",\n\t\t\t\t\"https://github.com/kubeflow/kubeflow/releases/tag/v0.6.2\",\n\t\t\t)}\n\t}\n\n\tconverters := map[string]Loader{\n\t\t\"v1alpha1\": V1alpha1{},\n\t\t\"v1beta1\":  V1beta1{},\n\t\t\"v1\":       V1{},\n\t}\n\n\tconverter, ok := converters[apiVersionSeparated[1]]\n\tif !ok {\n\t\tversions := []string{}\n\t\tfor key := range converters {\n\t\t\tversions = append(versions, key)\n\t\t}\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"invalid config: version not supported; supported versions: %v, got %v\",\n\t\t\t\tstrings.Join(versions, \", \"), apiVersionSeparated[1]),\n\t\t}\n\t}\n\n\tkfconfig, err := converter.LoadKfConfig(obj)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to convert kfdef to kfconfig: %v\", err)\n\t\treturn nil, err\n\t}\n\n\t// Set the AppDir and ConfigFileName for kfconfig\n\tif isRemoteFile {\n\t\tcwd, err := os.Getwd()\n\t\tif err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"could not get current directory for KfDef %v\", err),\n\t\t\t}\n\t\t}\n\t\tkfconfig.Spec.AppDir = cwd\n\t} else {\n\t\tkfconfig.Spec.AppDir = filepath.Dir(configFile)\n\t}\n\tkfconfig.Spec.ConfigFileName = filepath.Base(configFile)\n\treturn kfconfig, nil\n}\n\nfunc isCwdEmpty() string {\n\tcwd, _ := os.Getwd()\n\tfiles, _ := ioutil.ReadDir(cwd)\n\tif len(files) > 1 {\n\t\treturn \"\"\n\t}\n\treturn cwd\n}\n\nfunc WriteConfigToFile(config kfconfig.KfConfig) error {\n\tif config.Spec.AppDir == \"\" {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"No AppDir, cannot write to file.\",\n\t\t}\n\t}\n\tif config.Spec.ConfigFileName == \"\" {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: \"No ConfigFileName, cannot write to file.\",\n\t\t}\n\t}\n\tfilename := filepath.Join(config.Spec.AppDir, config.Spec.ConfigFileName)\n\tconverters := map[string]Loader{\n\t\t\"v1alpha1\": V1alpha1{},\n\t\t\"v1beta1\":  V1beta1{},\n\t\t\"v1\":       V1{},\n\t}\n\tapiVersionSeparated := strings.Split(config.APIVersion, \"/\")\n\tif len(apiVersionSeparated) < 2 || apiVersionSeparated[0] != Api {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"invalid config: apiVersion must be in the format of %v/<version>, got %v\", Api, config.APIVersion),\n\t\t}\n\t}\n\n\tconverter, ok := converters[apiVersionSeparated[1]]\n\tif !ok {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"invalid config: unable to find converter for version %v\", config.APIVersion),\n\t\t}\n\t}\n\n\tvar kfdef interface{}\n\tif err := converter.LoadKfDef(config, &kfdef); err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"error when loading KfDef: %v\", err),\n\t\t}\n\t}\n\tkfdefBytes, err := yaml.Marshal(kfdef)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"error when marshaling KfDef: %v\", err),\n\t\t}\n\t}\n\n\terr = ioutil.WriteFile(filename, kfdefBytes, 0644)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error when writing KfDef: %v\", err),\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/loaders_test.go",
    "content": "package loaders\n\nimport (\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n)\n\n// Make sure literal secrets are keeped during load kfdef -> kfconfig\nfunc Test_loadKfdefLiteralSecrets(t *testing.T) {\n\twd, _ := os.Getwd()\n\tkfconfig, err := LoadConfigFromURI(path.Join(wd, \"testdata\", \"kfctl_gcp_basic_auth.0.7.0.yaml\"))\n\tif err != nil || kfconfig == nil {\n\t\tt.Error(err)\n\t}\n\tif kfconfig.Spec.Secrets[0].SecretSource.LiteralSource.Value != \"passwordVal\" {\n\t\tt.Error(\"Secrets dropped during kfdef -> kfconfig!\")\n\t}\n\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/doc.go",
    "content": "package testdata\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/kfconfig_v1.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1\nkind: KfConfig\nmetadata:\n  creationTimestamp: null\n  name: myapp2\n  namespace: kubeflow\n  annotations:\n    testAnnotation: \"dummy\"\n  labels:\n    key1: \"value1\"\nspec:\n  project: foo-project\n  email: foo@gmail.com\n  platform: gcp\n  applications:\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-crds\n    name: istio-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-install\n    name: istio-install\n  - kustomizeConfig:\n      parameters:\n      - name: clusterRbacConfig\n        value: \"ON\"\n      repoRef:\n        name: manifests\n        path: istio/istio\n    name: istio\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: application/application-crds\n    name: application-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: application/application\n    name: application\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: metacontroller\n    name: metacontroller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: argo\n    name: argo\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: common/centraldashboard\n    name: centraldashboard\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: admission-webhook/webhook\n    name: webhook\n  - kustomizeConfig:\n      parameters:\n      - name: webhookNamePrefix\n        value: admission-webhook-\n      repoRef:\n        name: manifests\n        path: admission-webhook/bootstrap\n    name: bootstrap\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: jupyter/jupyter-web-app\n    name: jupyter-web-app\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-db\n    name: katib-db\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-manager\n    name: katib-manager\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-controller\n    name: katib-controller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-ui\n    name: katib-ui\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: metadata\n    name: metadata\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/metrics-collector\n    name: metrics-collector\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/suggestion\n    name: suggestion\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: injectGcpCredentials\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: jupyter/notebook-controller\n    name: notebook-controller\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-job-crds\n    name: pytorch-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-operator\n    name: pytorch-operator\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-crds\n    name: knative-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-install\n    name: knative-install\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-crds\n    name: kfserving-crds\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-install\n    name: kfserving-install\n  - kustomizeConfig:\n      parameters:\n      - name: usageId\n        value: \"123456\"\n      - name: reportUsage\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: common/spartakus\n    name: spartakus\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: tensorboard\n    name: tensorboard\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-operator\n    name: tf-job-operator\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/api-service\n    name: api-service\n  - kustomizeConfig:\n      overlays:\n      - minioPd\n      parameters:\n      - name: minioPd\n        value: test1-storage-artifact-store\n      - name: minioPvName\n        value: minio-pv\n      - name: minioPvcName\n        value: minio-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/minio\n    name: minio\n  - kustomizeConfig:\n      overlays:\n      - mysqlPd\n      parameters:\n      - name: mysqlPd\n        value: test1-storage-metadata-store\n      - name: mysqlPvName\n        value: mysql-pv\n      - name: mysqlPvcName\n        value: mysql-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/mysql\n    name: mysql\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/persistent-agent\n    name: persistent-agent\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-runner\n    name: pipelines-runner\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-ui\n    name: pipelines-ui\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-viewer\n    name: pipelines-viewer\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/scheduledworkflow\n    name: scheduledworkflow\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/cloud-endpoints\n    name: cloud-endpoints\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: admin\n        value: SET_EMAIL\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: profiles\n    name: profiles\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/gpu-driver\n    name: gpu-driver\n  - kustomizeConfig:\n      overlays:\n      - managed-cert\n      parameters:\n      - name: namespace\n        value: istio-system\n      - name: ipName\n        value: myapp2-ip\n      - name: hostname\n        value: myapp2.endpoints.foo-project.cloud.goog\n      repoRef:\n        name: manifests\n        path: gcp/iap-ingress\n    name: iap-ingress\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: seldon/seldon-core-operator\n    name: seldon-core-operator\n  plugins:\n  - kind: KfGcpPlugin\n    name: gcp\n    namespace: kubeflow\n    spec:\n      createPipelinePersistentStorage: true\n      deploymentManagerConfig:\n        repoRef:\n          name: manifests\n          path: gcp/deployment_manager_configs\n      email: foo@gmail.com\n      enableWorkloadIdentity: true\n      project: foo-project\n      skipInitProject: true\n      useBasicAuth: false\n  repos:\n  - name: manifests\n    uri: https://github.com/kubeflow/manifests/archive/master.tar.gz\n  secrets:\n  - name: env_password\n    secretSource:\n      envSource:\n        name: ENV_PASSWORD_NAME\n  - name: plain_text_password\n    secretSource:\n      literalSource:\n        value: 12345\n  SkipInitProject: true\n  useIstio: true\nstatus: {}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/kfconfig_v1alpha1.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1alpha1\nkind: KfConfig\nmetadata:\n  creationTimestamp: null\n  name: myapp2\n  namespace: kubeflow\n  annotations:\n    testAnnotation: \"dummy\"\n  labels:\n    key1: \"value1\"\nspec:\n  appDir: /tmp/myapp2\n  platform: gcp\n  project: foo-project\n  email: foo@gmail.com\n  applications:\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-crds\n    name: istio-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-install\n    name: istio-install\n  - kustomizeConfig:\n      parameters:\n      - name: clusterRbacConfig\n        value: \"ON\"\n      repoRef:\n        name: manifests\n        path: istio/istio\n    name: istio\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: application/application-crds\n    name: application-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: application/application\n    name: application\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: metacontroller\n    name: metacontroller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: argo\n    name: argo\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: common/centraldashboard\n    name: centraldashboard\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: admission-webhook/webhook\n    name: webhook\n  - kustomizeConfig:\n      parameters:\n      - name: webhookNamePrefix\n        value: admission-webhook-\n      repoRef:\n        name: manifests\n        path: admission-webhook/bootstrap\n    name: bootstrap\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: jupyter/jupyter-web-app\n    name: jupyter-web-app\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-db\n    name: katib-db\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-manager\n    name: katib-manager\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-controller\n    name: katib-controller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-ui\n    name: katib-ui\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: metadata\n    name: metadata\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/metrics-collector\n    name: metrics-collector\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/suggestion\n    name: suggestion\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: injectGcpCredentials\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: jupyter/notebook-controller\n    name: notebook-controller\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-job-crds\n    name: pytorch-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-operator\n    name: pytorch-operator\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-crds\n    name: knative-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-install\n    name: knative-install\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-crds\n    name: kfserving-crds\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-install\n    name: kfserving-install\n  - kustomizeConfig:\n      parameters:\n      - name: usageId\n        value: \"123456\"\n      - name: reportUsage\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: common/spartakus\n    name: spartakus\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: tensorboard\n    name: tensorboard\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-operator\n    name: tf-job-operator\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/api-service\n    name: api-service\n  - kustomizeConfig:\n      overlays:\n      - minioPd\n      parameters:\n      - name: minioPd\n        value: test1-storage-artifact-store\n      - name: minioPvName\n        value: minio-pv\n      - name: minioPvcName\n        value: minio-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/minio\n    name: minio\n  - kustomizeConfig:\n      overlays:\n      - mysqlPd\n      parameters:\n      - name: mysqlPd\n        value: test1-storage-metadata-store\n      - name: mysqlPvName\n        value: mysql-pv\n      - name: mysqlPvcName\n        value: mysql-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/mysql\n    name: mysql\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/persistent-agent\n    name: persistent-agent\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-runner\n    name: pipelines-runner\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-ui\n    name: pipelines-ui\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-viewer\n    name: pipelines-viewer\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/scheduledworkflow\n    name: scheduledworkflow\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/cloud-endpoints\n    name: cloud-endpoints\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: admin\n        value: SET_EMAIL\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: profiles\n    name: profiles\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/gpu-driver\n    name: gpu-driver\n  - kustomizeConfig:\n      overlays:\n      - managed-cert\n      parameters:\n      - name: namespace\n        value: istio-system\n      - name: ipName\n        value: myapp2-ip\n      - name: hostname\n        value: myapp2.endpoints.foo-project.cloud.goog\n      repoRef:\n        name: manifests\n        path: gcp/iap-ingress\n    name: iap-ingress\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: seldon/seldon-core-operator\n    name: seldon-core-operator\n  plugins:\n  - kind: KfGcpPlugin\n    name: gcp\n    namespace: kubeflow\n    spec:\n      createPipelinePersistentStorage: true\n      deploymentManagerConfig:\n        repoRef:\n          name: manifests\n          path: gcp/deployment_manager_configs\n      email: foo@gmail.com\n      enableWorkloadIdentity: true\n      project: foo-project\n      skipInitProject: true\n      useBasicAuth: false\n  repos:\n  - name: manifests\n    uri: https://github.com/kubeflow/manifests/archive/master.tar.gz\n  skipInitProject: true\n  useIstio: true\nstatus: {}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/kfconfig_v1beta1.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1beta1\nkind: KfConfig\nmetadata:\n  creationTimestamp: null\n  name: myapp2\n  namespace: kubeflow\n  annotations:\n    testAnnotation: \"dummy\"\n  labels:\n    key1: \"value1\"\nspec:\n  project: foo-project\n  email: foo@gmail.com\n  platform: gcp\n  applications:\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-crds\n    name: istio-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-install\n    name: istio-install\n  - kustomizeConfig:\n      parameters:\n      - name: clusterRbacConfig\n        value: \"ON\"\n      repoRef:\n        name: manifests\n        path: istio/istio\n    name: istio\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: application/application-crds\n    name: application-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: application/application\n    name: application\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: metacontroller\n    name: metacontroller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: argo\n    name: argo\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: common/centraldashboard\n    name: centraldashboard\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: admission-webhook/webhook\n    name: webhook\n  - kustomizeConfig:\n      parameters:\n      - name: webhookNamePrefix\n        value: admission-webhook-\n      repoRef:\n        name: manifests\n        path: admission-webhook/bootstrap\n    name: bootstrap\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: jupyter/jupyter-web-app\n    name: jupyter-web-app\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-db\n    name: katib-db\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-manager\n    name: katib-manager\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-controller\n    name: katib-controller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-ui\n    name: katib-ui\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: metadata\n    name: metadata\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/metrics-collector\n    name: metrics-collector\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/suggestion\n    name: suggestion\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: injectGcpCredentials\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: jupyter/notebook-controller\n    name: notebook-controller\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-job-crds\n    name: pytorch-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-operator\n    name: pytorch-operator\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-crds\n    name: knative-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-install\n    name: knative-install\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-crds\n    name: kfserving-crds\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-install\n    name: kfserving-install\n  - kustomizeConfig:\n      parameters:\n      - name: usageId\n        value: \"123456\"\n      - name: reportUsage\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: common/spartakus\n    name: spartakus\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: tensorboard\n    name: tensorboard\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-operator\n    name: tf-job-operator\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/api-service\n    name: api-service\n  - kustomizeConfig:\n      overlays:\n      - minioPd\n      parameters:\n      - name: minioPd\n        value: test1-storage-artifact-store\n      - name: minioPvName\n        value: minio-pv\n      - name: minioPvcName\n        value: minio-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/minio\n    name: minio\n  - kustomizeConfig:\n      overlays:\n      - mysqlPd\n      parameters:\n      - name: mysqlPd\n        value: test1-storage-metadata-store\n      - name: mysqlPvName\n        value: mysql-pv\n      - name: mysqlPvcName\n        value: mysql-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/mysql\n    name: mysql\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/persistent-agent\n    name: persistent-agent\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-runner\n    name: pipelines-runner\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-ui\n    name: pipelines-ui\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-viewer\n    name: pipelines-viewer\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/scheduledworkflow\n    name: scheduledworkflow\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/cloud-endpoints\n    name: cloud-endpoints\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: admin\n        value: SET_EMAIL\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: profiles\n    name: profiles\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/gpu-driver\n    name: gpu-driver\n  - kustomizeConfig:\n      overlays:\n      - managed-cert\n      parameters:\n      - name: namespace\n        value: istio-system\n      - name: ipName\n        value: myapp2-ip\n      - name: hostname\n        value: myapp2.endpoints.foo-project.cloud.goog\n      repoRef:\n        name: manifests\n        path: gcp/iap-ingress\n    name: iap-ingress\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: seldon/seldon-core-operator\n    name: seldon-core-operator\n  plugins:\n  - kind: KfGcpPlugin\n    name: gcp\n    namespace: kubeflow\n    spec:\n      createPipelinePersistentStorage: true\n      deploymentManagerConfig:\n        repoRef:\n          name: manifests\n          path: gcp/deployment_manager_configs\n      email: foo@gmail.com\n      enableWorkloadIdentity: true\n      project: foo-project\n      skipInitProject: true\n      useBasicAuth: false\n  repos:\n  - name: manifests\n    uri: https://github.com/kubeflow/manifests/archive/master.tar.gz\n  secrets:\n  - name: env_password\n    secretSource:\n      envSource:\n        name: ENV_PASSWORD_NAME\n  - name: plain_text_password\n    secretSource:\n      literalSource:\n        value: 12345\n  SkipInitProject: true\n  useIstio: true\nstatus: {}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/kfctl_gcp_basic_auth.0.7.0.yaml",
    "content": "# Please set project and email!\napiVersion: kfdef.apps.kubeflow.org/v1beta1\nkind: KfDef\nmetadata:\n  # If name is not set, kfctl will infer app name from the directory.\n  # name: myapp2\n  namespace: kubeflow\nspec:\n  applications:\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-crds\n    name: istio-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-install\n    name: istio-install\n  - kustomizeConfig:\n      parameters:\n      - name: clusterRbacConfig\n        value: \"OFF\"\n      repoRef:\n        name: manifests\n        path: istio/istio\n    name: istio\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: application/application-crds\n    name: application-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: application/application\n    name: application\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: metacontroller\n    name: metacontroller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: argo\n    name: argo\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kubeflow-roles\n    name: kubeflow-roles\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: common/centraldashboard\n    name: centraldashboard\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: admission-webhook/webhook\n    name: webhook\n  - kustomizeConfig:\n      overlays:\n      - application\n      parameters:\n      - name: webhookNamePrefix\n        value: admission-webhook-\n      repoRef:\n        name: manifests\n        path: admission-webhook/bootstrap\n    name: bootstrap\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: jupyter/jupyter-web-app\n    name: jupyter-web-app\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: metadata\n    name: metadata\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: injectGcpCredentials\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: jupyter/notebook-controller\n    name: notebook-controller\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-job-crds\n    name: pytorch-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-operator\n    name: pytorch-operator\n  - kustomizeConfig:\n      overlays:\n      - application\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-crds\n    name: knative-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-install\n    name: knative-install\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-crds\n    name: kfserving-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-install\n    name: kfserving-install\n  - kustomizeConfig:\n      overlays:\n      - application\n      parameters:\n      - name: usageId\n        value: \"2700513155662330975\"\n      - name: reportUsage\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: common/spartakus\n    name: spartakus\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: tensorboard\n    name: tensorboard\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-crds\n    name: tf-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-operator\n    name: tf-job-operator\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: katib/katib-crds\n    name: katib-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      - istio\n      repoRef:\n        name: manifests\n        path: katib/katib-controller\n    name: katib-controller\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pipeline/api-service\n    name: api-service\n  - kustomizeConfig:\n      overlays:\n      - minioPd\n      - application\n      parameters:\n      - name: minioPd\n        value: test1-storage-artifact-store\n      - name: minioPvName\n        value: minio-pv\n      - name: minioPvcName\n        value: minio-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/minio\n    name: minio\n  - kustomizeConfig:\n      overlays:\n      - mysqlPd\n      - application\n      parameters:\n      - name: mysqlPd\n        value: test1-storage-metadata-store\n      - name: mysqlPvName\n        value: mysql-pv\n      - name: mysqlPvcName\n        value: mysql-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/mysql\n    name: mysql\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pipeline/persistent-agent\n    name: persistent-agent\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-runner\n    name: pipelines-runner\n  - kustomizeConfig:\n      overlays:\n      - gcp\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-ui\n    name: pipelines-ui\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-viewer\n    name: pipelines-viewer\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pipeline/scheduledworkflow\n    name: scheduledworkflow\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pipeline/pipeline-visualization-service\n    name: pipeline-visualization-service\n  - kustomizeConfig:\n      overlays:\n      - application\n      parameters:\n      - name: ipName\n        value: ipName\n      - name: hostname\n      repoRef:\n        name: manifests\n        path: gcp/cloud-endpoints\n    name: cloud-endpoints\n  - kustomizeConfig:\n      overlays:\n      - application\n      - istio\n      parameters:\n      - name: admin\n        # email will be auto-filled.\n        # value: SET_EMAIL\n      repoRef:\n        name: manifests\n        path: profiles\n    name: profiles\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: gcp/gpu-driver\n    name: gpu-driver\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: seldon/seldon-core-operator\n    name: seldon-core-operator\n  - kustomizeConfig:\n      parameters:\n      - name: ambassadorServiceType\n        value: NodePort\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: common/ambassador\n    name: ambassador\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: common/basic-auth\n    name: basic-auth\n  - kustomizeConfig:\n      overlays:\n      - managed-cert\n      - application\n      parameters:\n      - name: namespace\n        value: istio-system\n      - name: ipName\n        # ipName will be auto-filled based on app name if not set.\n        # value: test1-ip\n      - name: hostname\n        # hostname will be auto-filled if not set.\n        # value: <deployName>.endpoints.<project>.cloud.goog\n      - name: project\n        # Project will be auto-filled.\n        # value: SET_PROJECT\n      - name: ingressName\n        value: envoy-ingress\n      - name: issuer\n        value: letsencrypt-prod\n      repoRef:\n        name: manifests\n        path: gcp/basic-auth-ingress\n    name: basic-auth-ingress\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: default-install\n    name: default-install\n  plugins:\n  - kind: KfGcpPlugin\n    metadata:\n      creationTimestamp: null\n      name: gcp\n    spec:\n      auth:\n        basicAuth:\n          username: usernameVal\n          password:\n            name: password\n      createPipelinePersistentStorage: true\n      deploymentManagerConfig:\n        repoRef:\n          name: manifests\n          path: gcp/deployment_manager_configs\n      enableWorkloadIdentity: true\n      skipInitProject: true\n      useBasicAuth: true\n      # email should  be set the google account of the person setting up Kubeflow.\n      # If its not set kfctl generate will try to set it automatically based on the default\n      # gcloud config\n      # email: <your_email@gmail.com>\n      #\n      # Project should be set to the GCP project you want to use.\n      # If you run kfctl init --config=<path>/kfctl_gcp_iap.yaml\n      # kfctl will try to automatically set it.\n      # project: <your project>\n      #\n      # User can specify which zone to deploy to. If not set, will try to auto-fill\n      # this field based on default config in gcloud.\n      # zone: us-east1-d\n  secrets:\n  - name: password\n    secretSource:\n      literalSource:\n        value: passwordVal\n  repos:\n  - name: manifests\n    uri: https://github.com/kubeflow/manifests/archive/c0e81bedec9a4df8acf568cc5ccacc4bc05a3b38.tar.gz\n  version: v0.7.0\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/v1.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1\nkind: KfDef\nmetadata:\n  creationTimestamp: null\n  name: myapp2\n  namespace: kubeflow\n  annotations:\n    testAnnotation: \"dummy\"\n  labels:\n    key1: \"value1\"\nspec:\n  applications:\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-crds\n    name: istio-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-install\n    name: istio-install\n  - kustomizeConfig:\n      parameters:\n      - name: clusterRbacConfig\n        value: \"ON\"\n      repoRef:\n        name: manifests\n        path: istio/istio\n    name: istio\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: application/application-crds\n    name: application-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: application/application\n    name: application\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: metacontroller\n    name: metacontroller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: argo\n    name: argo\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: common/centraldashboard\n    name: centraldashboard\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: admission-webhook/webhook\n    name: webhook\n  - kustomizeConfig:\n      parameters:\n      - name: webhookNamePrefix\n        value: admission-webhook-\n      repoRef:\n        name: manifests\n        path: admission-webhook/bootstrap\n    name: bootstrap\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: jupyter/jupyter-web-app\n    name: jupyter-web-app\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-db\n    name: katib-db\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-manager\n    name: katib-manager\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-controller\n    name: katib-controller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-ui\n    name: katib-ui\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: metadata\n    name: metadata\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/metrics-collector\n    name: metrics-collector\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/suggestion\n    name: suggestion\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: injectGcpCredentials\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: jupyter/notebook-controller\n    name: notebook-controller\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-job-crds\n    name: pytorch-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-operator\n    name: pytorch-operator\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-crds\n    name: knative-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-install\n    name: knative-install\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-crds\n    name: kfserving-crds\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-install\n    name: kfserving-install\n  - kustomizeConfig:\n      parameters:\n      - name: usageId\n        value: \"123456\"\n      - name: reportUsage\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: common/spartakus\n    name: spartakus\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: tensorboard\n    name: tensorboard\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-operator\n    name: tf-job-operator\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/api-service\n    name: api-service\n  - kustomizeConfig:\n      overlays:\n      - minioPd\n      parameters:\n      - name: minioPd\n        value: test1-storage-artifact-store\n      - name: minioPvName\n        value: minio-pv\n      - name: minioPvcName\n        value: minio-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/minio\n    name: minio\n  - kustomizeConfig:\n      overlays:\n      - mysqlPd\n      parameters:\n      - name: mysqlPd\n        value: test1-storage-metadata-store\n      - name: mysqlPvName\n        value: mysql-pv\n      - name: mysqlPvcName\n        value: mysql-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/mysql\n    name: mysql\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/persistent-agent\n    name: persistent-agent\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-runner\n    name: pipelines-runner\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-ui\n    name: pipelines-ui\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-viewer\n    name: pipelines-viewer\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/scheduledworkflow\n    name: scheduledworkflow\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/cloud-endpoints\n    name: cloud-endpoints\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: admin\n        value: SET_EMAIL\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: profiles\n    name: profiles\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/gpu-driver\n    name: gpu-driver\n  - kustomizeConfig:\n      overlays:\n      - managed-cert\n      parameters:\n      - name: namespace\n        value: istio-system\n      - name: ipName\n        value: myapp2-ip\n      - name: hostname\n        value: myapp2.endpoints.foo-project.cloud.goog\n      repoRef:\n        name: manifests\n        path: gcp/iap-ingress\n    name: iap-ingress\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: seldon/seldon-core-operator\n    name: seldon-core-operator\n  plugins:\n  - kind: KfGcpPlugin\n    metadata:\n      creationTimestamp: null\n      name: gcp\n    spec:\n      createPipelinePersistentStorage: true\n      deploymentManagerConfig:\n        repoRef:\n          name: manifests\n          path: gcp/deployment_manager_configs\n      email: foo@gmail.com\n      enableWorkloadIdentity: true\n      project: foo-project\n      skipInitProject: true\n      useBasicAuth: false\n  repos:\n  - name: manifests\n    uri: https://github.com/kubeflow/manifests/archive/master.tar.gz\n  secrets:\n  - name: env_password\n    secretSource:\n      envSource:\n        name: ENV_PASSWORD_NAME\n  - name: plain_text_password\n    secretSource:\n      literalSource:\n        value: 12345\nstatus: {}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/v1alpha1.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1alpha1\nkind: KfDef\nmetadata:\n  creationTimestamp: null\n  name: myapp2\n  namespace: kubeflow\n  annotations:\n    testAnnotation: \"dummy\"\n  labels:\n    key1: \"value1\"\nspec:\n  repos:\n  - name: manifests\n    uri: https://github.com/kubeflow/manifests/archive/master.tar.gz\n  appdir: /tmp/myapp2\n  applications:\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-crds\n    name: istio-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-install\n    name: istio-install\n  - kustomizeConfig:\n      parameters:\n      - name: clusterRbacConfig\n        value: \"ON\"\n      repoRef:\n        name: manifests\n        path: istio/istio\n    name: istio\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: application/application-crds\n    name: application-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: application/application\n    name: application\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: metacontroller\n    name: metacontroller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: argo\n    name: argo\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: \"accounts.google.com:\"\n      repoRef:\n        name: manifests\n        path: common/centraldashboard\n    name: centraldashboard\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: admission-webhook/webhook\n    name: webhook\n  - kustomizeConfig:\n      parameters:\n      - name: webhookNamePrefix\n        value: admission-webhook-\n      repoRef:\n        name: manifests\n        path: admission-webhook/bootstrap\n    name: bootstrap\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: \"accounts.google.com:\"\n      repoRef:\n        name: manifests\n        path: jupyter/jupyter-web-app\n    name: jupyter-web-app\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-db\n    name: katib-db\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-manager\n    name: katib-manager\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-controller\n    name: katib-controller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-ui\n    name: katib-ui\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: metadata\n    name: metadata\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/metrics-collector\n    name: metrics-collector\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/suggestion\n    name: suggestion\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: injectGcpCredentials\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: jupyter/notebook-controller\n    name: notebook-controller\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-job-crds\n    name: pytorch-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-operator\n    name: pytorch-operator\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-crds\n    name: knative-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-install\n    name: knative-install\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-crds\n    name: kfserving-crds\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-install\n    name: kfserving-install\n  - kustomizeConfig:\n      parameters:\n      - name: usageId\n        value: \"123456\"\n      - name: reportUsage\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: common/spartakus\n    name: spartakus\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: tensorboard\n    name: tensorboard\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-operator\n    name: tf-job-operator\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/api-service\n    name: api-service\n  - kustomizeConfig:\n      overlays:\n      - minioPd\n      parameters:\n      - name: minioPd\n        value: test1-storage-artifact-store\n      - name: minioPvName\n        value: minio-pv\n      - name: minioPvcName\n        value: minio-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/minio\n    name: minio\n  - kustomizeConfig:\n      overlays:\n      - mysqlPd\n      parameters:\n      - name: mysqlPd\n        value: test1-storage-metadata-store\n      - name: mysqlPvName\n        value: mysql-pv\n      - name: mysqlPvcName\n        value: mysql-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/mysql\n    name: mysql\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/persistent-agent\n    name: persistent-agent\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-runner\n    name: pipelines-runner\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-ui\n    name: pipelines-ui\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-viewer\n    name: pipelines-viewer\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/scheduledworkflow\n    name: scheduledworkflow\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/cloud-endpoints\n    name: cloud-endpoints\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: admin\n        value: SET_EMAIL\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: \"accounts.google.com:\"\n      repoRef:\n        name: manifests\n        path: profiles\n    name: profiles\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/gpu-driver\n    name: gpu-driver\n  - kustomizeConfig:\n      overlays:\n      - managed-cert\n      parameters:\n      - name: namespace\n        value: istio-system\n      - name: ipName\n        value: myapp2-ip\n      - name: hostname\n        value: myapp2.endpoints.foo-project.cloud.goog\n      repoRef:\n        name: manifests\n        path: gcp/iap-ingress\n    name: iap-ingress\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: seldon/seldon-core-operator\n    name: seldon-core-operator\n  email: foo@gmail.com\n  enableApplications: true\n  packageManager: kustomize\n  platform: gcp\n  plugins:\n  - name: gcp\n    spec:\n      createPipelinePersistentStorage: true\n      deploymentManagerConfig:\n        repoRef:\n          name: manifests\n          path: gcp/deployment_manager_configs\n      enableWorkloadIdentity: true\n      useBasicAuth: false\n  skipInitProject: true\n  useBasicAuth: false\n  useIstio: true\n  project: foo-project\n"
  },
  {
    "path": "pkg/kfconfig/loaders/testdata/v1beta1.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1beta1\nkind: KfDef\nmetadata:\n  creationTimestamp: null\n  name: myapp2\n  namespace: kubeflow\n  annotations:\n    testAnnotation: \"dummy\"\n  labels:\n    key1: \"value1\"\nspec:\n  applications:\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-crds\n    name: istio-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: istio-system\n      repoRef:\n        name: manifests\n        path: istio/istio-install\n    name: istio-install\n  - kustomizeConfig:\n      parameters:\n      - name: clusterRbacConfig\n        value: \"ON\"\n      repoRef:\n        name: manifests\n        path: istio/istio\n    name: istio\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: application/application-crds\n    name: application-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: application/application\n    name: application\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: metacontroller\n    name: metacontroller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: argo\n    name: argo\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: common/centraldashboard\n    name: centraldashboard\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: admission-webhook/webhook\n    name: webhook\n  - kustomizeConfig:\n      parameters:\n      - name: webhookNamePrefix\n        value: admission-webhook-\n      repoRef:\n        name: manifests\n        path: admission-webhook/bootstrap\n    name: bootstrap\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: jupyter/jupyter-web-app\n    name: jupyter-web-app\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-db\n    name: katib-db\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-manager\n    name: katib-manager\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-controller\n    name: katib-controller\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/katib-ui\n    name: katib-ui\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: metadata\n    name: metadata\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/metrics-collector\n    name: metrics-collector\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: katib-v1alpha2/suggestion\n    name: suggestion\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      parameters:\n      - name: injectGcpCredentials\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: jupyter/notebook-controller\n    name: notebook-controller\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-job-crds\n    name: pytorch-job-crds\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: pytorch-job/pytorch-operator\n    name: pytorch-operator\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-crds\n    name: knative-crds\n  - kustomizeConfig:\n      parameters:\n      - name: namespace\n        value: knative-serving\n      repoRef:\n        name: manifests\n        path: knative/knative-serving-install\n    name: knative-install\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-crds\n    name: kfserving-crds\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: kfserving/kfserving-install\n    name: kfserving-install\n  - kustomizeConfig:\n      parameters:\n      - name: usageId\n        value: \"123456\"\n      - name: reportUsage\n        value: \"true\"\n      repoRef:\n        name: manifests\n        path: common/spartakus\n    name: spartakus\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: tensorboard\n    name: tensorboard\n  - kustomizeConfig:\n      overlays:\n      - istio\n      - application\n      repoRef:\n        name: manifests\n        path: tf-training/tf-job-operator\n    name: tf-job-operator\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/api-service\n    name: api-service\n  - kustomizeConfig:\n      overlays:\n      - minioPd\n      parameters:\n      - name: minioPd\n        value: test1-storage-artifact-store\n      - name: minioPvName\n        value: minio-pv\n      - name: minioPvcName\n        value: minio-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/minio\n    name: minio\n  - kustomizeConfig:\n      overlays:\n      - mysqlPd\n      parameters:\n      - name: mysqlPd\n        value: test1-storage-metadata-store\n      - name: mysqlPvName\n        value: mysql-pv\n      - name: mysqlPvcName\n        value: mysql-pv-claim\n      repoRef:\n        name: manifests\n        path: pipeline/mysql\n    name: mysql\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/persistent-agent\n    name: persistent-agent\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-runner\n    name: pipelines-runner\n  - kustomizeConfig:\n      overlays:\n      - istio\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-ui\n    name: pipelines-ui\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/pipelines-viewer\n    name: pipelines-viewer\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: pipeline/scheduledworkflow\n    name: scheduledworkflow\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/cloud-endpoints\n    name: cloud-endpoints\n  - kustomizeConfig:\n      overlays:\n      - istio\n      parameters:\n      - name: admin\n        value: SET_EMAIL\n      - name: userid-header\n        value: X-Goog-Authenticated-User-Email\n      - name: userid-prefix\n        value: 'accounts.google.com:'\n      repoRef:\n        name: manifests\n        path: profiles\n    name: profiles\n  - kustomizeConfig:\n      repoRef:\n        name: manifests\n        path: gcp/gpu-driver\n    name: gpu-driver\n  - kustomizeConfig:\n      overlays:\n      - managed-cert\n      parameters:\n      - name: namespace\n        value: istio-system\n      - name: ipName\n        value: myapp2-ip\n      - name: hostname\n        value: myapp2.endpoints.foo-project.cloud.goog\n      repoRef:\n        name: manifests\n        path: gcp/iap-ingress\n    name: iap-ingress\n  - kustomizeConfig:\n      overlays:\n      - application\n      repoRef:\n        name: manifests\n        path: seldon/seldon-core-operator\n    name: seldon-core-operator\n  plugins:\n  - kind: KfGcpPlugin\n    metadata:\n      creationTimestamp: null\n      name: gcp\n    spec:\n      createPipelinePersistentStorage: true\n      deploymentManagerConfig:\n        repoRef:\n          name: manifests\n          path: gcp/deployment_manager_configs\n      email: foo@gmail.com\n      enableWorkloadIdentity: true\n      project: foo-project\n      skipInitProject: true\n      useBasicAuth: false\n  repos:\n  - name: manifests\n    uri: https://github.com/kubeflow/manifests/archive/master.tar.gz\n  secrets:\n  - name: env_password\n    secretSource:\n      envSource:\n        name: ENV_PASSWORD_NAME\n  - name: plain_text_password\n    secretSource:\n      literalSource:\n        value: 12345\nstatus: {}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/utils.go",
    "content": "package loaders\n\nimport (\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n)\n\nfunc maybeGetPlatform(pluginKind string) string {\n\tplatforms := map[string]string{\n\t\tstring(kfconfig.AWS_PLUGIN_KIND):              kftypesv3.AWS,\n\t\tstring(kfconfig.GCP_PLUGIN_KIND):              kftypesv3.GCP,\n\t\tstring(kfconfig.EXISTING_ARRIKTO_PLUGIN_KIND): kftypesv3.EXISTING_ARRIKTO,\n\t}\n\n\tp, ok := platforms[pluginKind]\n\tif ok {\n\t\treturn p\n\t} else {\n\t\treturn \"\"\n\t}\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/v1.go",
    "content": "package loaders\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ghodss/yaml\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkfdeftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1\"\n\tkfdefgcpplugin \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/gcp/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n)\n\n// Empty struct - used to implement Converter interface.\ntype V1 struct {\n}\n\nfunc (v V1) LoadKfConfig(def interface{}) (*kfconfig.KfConfig, error) {\n\tkfdef := &kfdeftypes.KfDef{}\n\tif bytes, err := yaml.Marshal(def); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not marshal kfdef into bytes: %v\", err),\n\t\t}\n\t} else {\n\t\terr = yaml.Unmarshal(bytes, kfdef)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"could not unpack kfdef: %v\", err),\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set UseBasicAuth later.\n\tconfig := &kfconfig.KfConfig{\n\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\tUseBasicAuth: false,\n\t\t},\n\t}\n\tconfig.Name = kfdef.Name\n\tconfig.Namespace = kfdef.Namespace\n\tconfig.APIVersion = kfdef.APIVersion\n\tconfig.Kind = \"KfConfig\"\n\tconfig.Labels = kfdef.Labels\n\tconfig.Annotations = kfdef.Annotations\n\tconfig.ClusterName = kfdef.ClusterName\n\tconfig.Spec.Version = kfdef.Spec.Version\n\tfor i, app := range kfdef.Spec.Applications {\n\t\tif app.Name == \"\" {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"must have name for application. missing application name on application[%d] in kfdef\", i),\n\t\t\t}\n\t\t}\n\t\tapplication := kfconfig.Application{\n\t\t\tName: app.Name,\n\t\t}\n\t\tif app.KustomizeConfig != nil {\n\t\t\tkconfig := &kfconfig.KustomizeConfig{\n\t\t\t\tOverlays: app.KustomizeConfig.Overlays,\n\t\t\t}\n\t\t\tif app.KustomizeConfig.RepoRef != nil {\n\t\t\t\tkref := &kfconfig.RepoRef{\n\t\t\t\t\tName: app.KustomizeConfig.RepoRef.Name,\n\t\t\t\t\tPath: app.KustomizeConfig.RepoRef.Path,\n\t\t\t\t}\n\t\t\t\tkconfig.RepoRef = kref\n\n\t\t\t\t// Use application to infer whether UseBasicAuth is true.\n\t\t\t\tif kref.Path == \"common/basic-auth\" {\n\t\t\t\t\tconfig.Spec.UseBasicAuth = true\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, param := range app.KustomizeConfig.Parameters {\n\t\t\t\tp := kfconfig.NameValue{\n\t\t\t\t\tName:  param.Name,\n\t\t\t\t\tValue: param.Value,\n\t\t\t\t}\n\t\t\t\tkconfig.Parameters = append(kconfig.Parameters, p)\n\t\t\t}\n\t\t\tapplication.KustomizeConfig = kconfig\n\t\t}\n\t\tconfig.Spec.Applications = append(config.Spec.Applications, application)\n\t}\n\n\tfor _, plugin := range kfdef.Spec.Plugins {\n\t\tp := kfconfig.Plugin{\n\t\t\tName:      plugin.Name,\n\t\t\tNamespace: kfdef.Namespace,\n\t\t\tKind:      kfconfig.PluginKindType(plugin.Kind),\n\t\t\tSpec:      plugin.Spec,\n\t\t}\n\t\tconfig.Spec.Plugins = append(config.Spec.Plugins, p)\n\n\t\tif plugin.Kind == string(kfconfig.GCP_PLUGIN_KIND) {\n\t\t\tspec := kfdefgcpplugin.GcpPluginSpec{}\n\t\t\tif err := kfdef.GetPluginSpec(plugin.Kind, &spec); err != nil {\n\t\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"could not retrieve GCP plugin spec: %v\", err),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconfig.Spec.Project = spec.Project\n\t\t\tconfig.Spec.Email = spec.Email\n\t\t\tconfig.Spec.IpName = spec.IpName\n\t\t\tconfig.Spec.Hostname = spec.Hostname\n\t\t\tconfig.Spec.SkipInitProject = spec.SkipInitProject\n\t\t\tconfig.Spec.Zone = spec.Zone\n\t\t\tconfig.Spec.DeleteStorage = spec.DeleteStorage\n\t\t}\n\t\tif p := maybeGetPlatform(plugin.Kind); p != \"\" {\n\t\t\tconfig.Spec.Platform = p\n\t\t}\n\t}\n\n\tfor _, secret := range kfdef.Spec.Secrets {\n\t\ts := kfconfig.Secret{\n\t\t\tName: secret.Name,\n\t\t}\n\t\tsrc := &kfconfig.SecretSource{}\n\t\t// kfdef -> kfconfig should keep  literalSource , becasue only kfdef should be checked into source control,\n\t\t// We only filter secrets during kfconfig -> kfdef.\n\t\tif secret.SecretSource.LiteralSource != nil {\n\t\t\tsrc.LiteralSource = &kfconfig.LiteralSource{\n\t\t\t\tValue: secret.SecretSource.LiteralSource.Value,\n\t\t\t}\n\t\t}\n\t\tif secret.SecretSource.EnvSource != nil {\n\t\t\tsrc.EnvSource = &kfconfig.EnvSource{\n\t\t\t\tName: secret.SecretSource.EnvSource.Name,\n\t\t\t}\n\t\t}\n\t\ts.SecretSource = src\n\t\tconfig.Spec.Secrets = append(config.Spec.Secrets, s)\n\t}\n\n\tfor _, repo := range kfdef.Spec.Repos {\n\t\tr := kfconfig.Repo{\n\t\t\tName: repo.Name,\n\t\t\tURI:  repo.URI,\n\t\t}\n\t\tconfig.Spec.Repos = append(config.Spec.Repos, r)\n\t}\n\n\tfor _, cond := range kfdef.Status.Conditions {\n\t\tc := kfconfig.Condition{\n\t\t\tType:               kfconfig.ConditionType(cond.Type),\n\t\t\tStatus:             cond.Status,\n\t\t\tLastUpdateTime:     cond.LastUpdateTime,\n\t\t\tLastTransitionTime: cond.LastTransitionTime,\n\t\t\tReason:             cond.Reason,\n\t\t\tMessage:            cond.Message,\n\t\t}\n\t\tconfig.Status.Conditions = append(config.Status.Conditions, c)\n\t}\n\tfor _, cache := range kfdef.Status.ReposCache {\n\t\tc := kfconfig.Cache{\n\t\t\tName:      cache.Name,\n\t\t\tLocalPath: cache.LocalPath,\n\t\t}\n\t\tconfig.Status.Caches = append(config.Status.Caches, c)\n\t}\n\n\treturn config, nil\n}\n\nfunc (v V1) LoadKfDef(config kfconfig.KfConfig, out interface{}) error {\n\tkfdef := &kfdeftypes.KfDef{}\n\tkfdef.Name = config.Name\n\tkfdef.Namespace = config.Namespace\n\tkfdef.APIVersion = config.APIVersion\n\tkfdef.Kind = \"KfDef\"\n\tkfdef.Labels = config.Labels\n\tkfdef.Annotations = config.Annotations\n\tkfdef.ClusterName = config.ClusterName\n\tkfdef.Spec.Version = config.Spec.Version\n\n\tfor _, app := range config.Spec.Applications {\n\t\tapplication := kfdeftypes.Application{\n\t\t\tName: app.Name,\n\t\t}\n\t\tif app.KustomizeConfig != nil {\n\t\t\tkconfig := &kfdeftypes.KustomizeConfig{\n\t\t\t\tOverlays: app.KustomizeConfig.Overlays,\n\t\t\t}\n\t\t\tif app.KustomizeConfig.RepoRef != nil {\n\t\t\t\tkref := &kfdeftypes.RepoRef{\n\t\t\t\t\tName: app.KustomizeConfig.RepoRef.Name,\n\t\t\t\t\tPath: app.KustomizeConfig.RepoRef.Path,\n\t\t\t\t}\n\t\t\t\tkconfig.RepoRef = kref\n\t\t\t}\n\t\t\tfor _, param := range app.KustomizeConfig.Parameters {\n\t\t\t\tp := kfdeftypes.NameValue{\n\t\t\t\t\tName:  param.Name,\n\t\t\t\t\tValue: param.Value,\n\t\t\t\t}\n\t\t\t\tkconfig.Parameters = append(kconfig.Parameters, p)\n\t\t\t}\n\t\t\tapplication.KustomizeConfig = kconfig\n\t\t}\n\t\tkfdef.Spec.Applications = append(kfdef.Spec.Applications, application)\n\t}\n\n\tfor _, plugin := range config.Spec.Plugins {\n\t\tp := kfdeftypes.Plugin{\n\t\t\tSpec: plugin.Spec,\n\t\t}\n\t\tp.Name = plugin.Name\n\t\tp.Kind = string(plugin.Kind)\n\t\tkfdef.Spec.Plugins = append(kfdef.Spec.Plugins, p)\n\t}\n\n\tfor _, secret := range config.Spec.Secrets {\n\t\ts := kfdeftypes.Secret{\n\t\t\tName: secret.Name,\n\t\t}\n\t\tif secret.SecretSource != nil {\n\t\t\ts.SecretSource = &kfdeftypes.SecretSource{}\n\t\t\t// We don't want to store literalSource explictly, becasue we want the config to be checked into source control and don't want secrets in source control.\n\t\t\tif secret.SecretSource.EnvSource != nil {\n\t\t\t\ts.SecretSource.EnvSource = &kfdeftypes.EnvSource{\n\t\t\t\t\tName: secret.SecretSource.EnvSource.Name,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tkfdef.Spec.Secrets = append(kfdef.Spec.Secrets, s)\n\t}\n\n\tfor _, repo := range config.Spec.Repos {\n\t\tr := kfdeftypes.Repo{\n\t\t\tName: repo.Name,\n\t\t\tURI:  repo.URI,\n\t\t}\n\t\tkfdef.Spec.Repos = append(kfdef.Spec.Repos, r)\n\t}\n\n\tfor _, cond := range config.Status.Conditions {\n\t\tc := kfdeftypes.KfDefCondition{\n\t\t\tType:               kfdeftypes.KfDefConditionType(cond.Type),\n\t\t\tStatus:             cond.Status,\n\t\t\tLastUpdateTime:     cond.LastUpdateTime,\n\t\t\tLastTransitionTime: cond.LastTransitionTime,\n\t\t\tReason:             cond.Reason,\n\t\t\tMessage:            cond.Message,\n\t\t}\n\t\tkfdef.Status.Conditions = append(kfdef.Status.Conditions, c)\n\t}\n\n\tfor _, cache := range config.Status.Caches {\n\t\tc := kfdeftypes.RepoCache{\n\t\t\tName:      cache.Name,\n\t\t\tLocalPath: cache.LocalPath,\n\t\t}\n\t\tkfdef.Status.ReposCache = append(kfdef.Status.ReposCache, c)\n\t}\n\n\tkfdefBytes, err := yaml.Marshal(kfdef)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error when marshaling to KfDef: %v\", err),\n\t\t}\n\t}\n\n\terr = yaml.Unmarshal(kfdefBytes, out)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error when unmarshaling to KfDef: %v\", err),\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/v1_test.go",
    "content": "package loaders\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tkfutils \"github.com/kubeflow/kfctl/v3/pkg/utils\"\n)\n\nfunc TestV1_expectedConfig(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    string\n\t\tExpected string\n\t}\n\n\tcases := []testCase{\n\t\ttestCase{\n\t\t\tInput:    \"v1.yaml\",\n\t\t\tExpected: \"kfconfig_v1.yaml\",\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Input)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\t\tvar obj interface{}\n\t\tif err := yaml.Unmarshal(buf, &obj); err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling file %v; error %v\", fPath, err)\n\t\t}\n\n\t\tv1beta1 := V1beta1{}\n\t\tconfig, err := v1beta1.LoadKfConfig(obj)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error converting to KfConfig: %v\", err)\n\t\t}\n\n\t\tePath := path.Join(wd, \"testdata\", c.Expected)\n\t\teBuf, err := ioutil.ReadFile(ePath)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when reading KfConfig: %v\", err)\n\t\t}\n\t\texpectedConfig := &kfconfig.KfConfig{}\n\t\terr = yaml.Unmarshal(eBuf, expectedConfig)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling KfConfig: %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(config, expectedConfig) {\n\t\t\tpGot := kfutils.PrettyPrint(config)\n\t\t\tpWant := kfutils.PrettyPrint(expectedConfig)\n\t\t\tt.Errorf(\"Loaded KfConfig doesn't match %v\", cmp.Diff(pGot, pWant))\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/v1alpha1.go",
    "content": "package loaders\n\nimport (\n\t\"fmt\"\n\t\"github.com/ghodss/yaml\"\n\tconfigsv3 \"github.com/kubeflow/kfctl/v3/config\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tkfdeftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n\tkfgcpplugin \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/gcp/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n)\n\n// Empty struct - used to implement Converter interface.\ntype V1alpha1 struct {\n}\n\nfunc pluginNameToKind(pluginName string) kfconfig.PluginKindType {\n\tmapper := map[string]kfconfig.PluginKindType{\n\t\tkftypesv3.AWS:              kfconfig.AWS_PLUGIN_KIND,\n\t\tkftypesv3.GCP:              kfconfig.GCP_PLUGIN_KIND,\n\t\tkftypesv3.MINIKUBE:         kfconfig.MINIKUBE_PLUGIN_KIND,\n\t\tkftypesv3.EXISTING_ARRIKTO: kfconfig.EXISTING_ARRIKTO_PLUGIN_KIND,\n\t}\n\tkind, ok := mapper[pluginName]\n\tif ok {\n\t\treturn kind\n\t} else {\n\t\treturn kfconfig.PluginKindType(\"KfUnknownPlugin\")\n\t}\n}\n\n// Copy GCP plugin spec. Will skip if platform is not GCP.\nfunc copyGcpPluginSpec(from *kfdeftypes.KfDef, to *kfconfig.KfConfig) error {\n\tif from.Spec.Platform != kftypesv3.GCP {\n\t\treturn nil\n\t}\n\n\tspec := kfgcpplugin.GcpPluginSpec{}\n\tif err := to.GetPluginSpec(kfconfig.GCP_PLUGIN_KIND, &spec); err != nil && !kfconfig.IsPluginNotFound(err) {\n\t\treturn err\n\t}\n\tspec.Project = from.Spec.Project\n\tspec.Email = from.Spec.Email\n\tspec.IpName = from.Spec.IpName\n\tspec.Hostname = from.Spec.Hostname\n\tspec.Zone = from.Spec.Zone\n\tspec.UseBasicAuth = from.Spec.UseBasicAuth\n\tspec.SkipInitProject = from.Spec.SkipInitProject\n\tspec.DeleteStorage = from.Spec.DeleteStorage\n\treturn to.SetPluginSpec(kfconfig.GCP_PLUGIN_KIND, spec)\n}\n\nfunc (v V1alpha1) LoadKfConfig(def interface{}) (*kfconfig.KfConfig, error) {\n\tkfdef := &kfdeftypes.KfDef{}\n\tif bytes, err := yaml.Marshal(def); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not marshal kfdef into bytes: %v\", err),\n\t\t}\n\t} else {\n\t\terr = yaml.Unmarshal(bytes, kfdef)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"could not unpack kfdef: %v\", err),\n\t\t\t}\n\t\t}\n\t}\n\n\tconfig := &kfconfig.KfConfig{\n\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\tAppDir:          kfdef.Spec.AppDir,\n\t\t\tVersion:         kfdef.Spec.Version,\n\t\t\tUseBasicAuth:    kfdef.Spec.UseBasicAuth,\n\t\t\tProject:         kfdef.Spec.Project,\n\t\t\tEmail:           kfdef.Spec.Email,\n\t\t\tIpName:          kfdef.Spec.IpName,\n\t\t\tHostname:        kfdef.Spec.Hostname,\n\t\t\tSkipInitProject: kfdef.Spec.SkipInitProject,\n\t\t\tZone:            kfdef.Spec.Zone,\n\t\t\tPlatform:        kfdef.Spec.Platform,\n\t\t},\n\t}\n\tconfig.Name = kfdef.Name\n\tconfig.Namespace = kfdef.Namespace\n\tconfig.APIVersion = kfdef.APIVersion\n\tconfig.Kind = \"KfConfig\"\n\tconfig.Labels = kfdef.Labels\n\tconfig.Annotations = kfdef.Annotations\n\tconfig.ClusterName = kfdef.ClusterName\n\tfor _, app := range kfdef.Spec.Applications {\n\t\tapplication := kfconfig.Application{\n\t\t\tName: app.Name,\n\t\t}\n\t\tif app.KustomizeConfig != nil {\n\t\t\tkconfig := &kfconfig.KustomizeConfig{\n\t\t\t\tOverlays: app.KustomizeConfig.Overlays,\n\t\t\t}\n\t\t\tif app.KustomizeConfig.RepoRef != nil {\n\t\t\t\tkref := &kfconfig.RepoRef{\n\t\t\t\t\tName: app.KustomizeConfig.RepoRef.Name,\n\t\t\t\t\tPath: app.KustomizeConfig.RepoRef.Path,\n\t\t\t\t}\n\t\t\t\tkconfig.RepoRef = kref\n\t\t\t}\n\t\t\tfor _, param := range app.KustomizeConfig.Parameters {\n\t\t\t\tp := kfconfig.NameValue{\n\t\t\t\t\tName:  param.Name,\n\t\t\t\t\tValue: param.Value,\n\t\t\t\t}\n\t\t\t\tkconfig.Parameters = append(kconfig.Parameters, p)\n\t\t\t}\n\t\t\tapplication.KustomizeConfig = kconfig\n\t\t}\n\t\tconfig.Spec.Applications = append(config.Spec.Applications, application)\n\t}\n\n\tfor _, plugin := range kfdef.Spec.Plugins {\n\t\tp := kfconfig.Plugin{\n\t\t\tName:      plugin.Name,\n\t\t\tNamespace: kfdef.Namespace,\n\t\t\tKind:      pluginNameToKind(plugin.Name),\n\t\t\tSpec:      plugin.Spec,\n\t\t}\n\t\tconfig.Spec.Plugins = append(config.Spec.Plugins, p)\n\t}\n\tspecCopiers := []func(*kfdeftypes.KfDef, *kfconfig.KfConfig) error{\n\t\tcopyGcpPluginSpec,\n\t}\n\tfor _, copier := range specCopiers {\n\t\tif err := copier(kfdef, config); err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"error copying plugin specs: %v\", err),\n\t\t\t}\n\n\t\t}\n\t}\n\n\tfor _, secret := range kfdef.Spec.Secrets {\n\t\ts := kfconfig.Secret{\n\t\t\tName: secret.Name,\n\t\t}\n\t\tif secret.SecretSource == nil {\n\t\t\tconfig.Spec.Secrets = append(config.Spec.Secrets, s)\n\t\t\tcontinue\n\t\t}\n\t\tsrc := &kfconfig.SecretSource{}\n\t\tif secret.SecretSource.LiteralSource != nil {\n\t\t\tsrc.LiteralSource = &kfconfig.LiteralSource{\n\t\t\t\tValue: secret.SecretSource.LiteralSource.Value,\n\t\t\t}\n\t\t} else if secret.SecretSource.EnvSource != nil {\n\t\t\tsrc.EnvSource = &kfconfig.EnvSource{\n\t\t\t\tName: secret.SecretSource.EnvSource.Name,\n\t\t\t}\n\t\t} else if secret.SecretSource.HashedSource != nil {\n\t\t\tsrc.HashedSource = &kfconfig.HashedSource{\n\t\t\t\tHashedValue: secret.SecretSource.HashedSource.HashedValue,\n\t\t\t}\n\t\t}\n\t\ts.SecretSource = src\n\t\tconfig.Spec.Secrets = append(config.Spec.Secrets, s)\n\t}\n\n\tfor _, repo := range kfdef.Spec.Repos {\n\t\tr := kfconfig.Repo{\n\t\t\tName: repo.Name,\n\t\t\tURI:  repo.Uri,\n\t\t}\n\t\tconfig.Spec.Repos = append(config.Spec.Repos, r)\n\t}\n\n\tfor _, cond := range kfdef.Status.Conditions {\n\t\tc := kfconfig.Condition{\n\t\t\tType:               kfconfig.ConditionType(cond.Type),\n\t\t\tStatus:             cond.Status,\n\t\t\tLastUpdateTime:     cond.LastUpdateTime,\n\t\t\tLastTransitionTime: cond.LastTransitionTime,\n\t\t\tReason:             cond.Reason,\n\t\t\tMessage:            cond.Message,\n\t\t}\n\t\tconfig.Status.Conditions = append(config.Status.Conditions, c)\n\t}\n\tfor name, cache := range kfdef.Status.ReposCache {\n\t\tc := kfconfig.Cache{\n\t\t\tName:      name,\n\t\t\tLocalPath: cache.LocalPath,\n\t\t}\n\t\tconfig.Status.Caches = append(config.Status.Caches, c)\n\t}\n\n\treturn config, nil\n}\n\nfunc (v V1alpha1) LoadKfDef(config kfconfig.KfConfig, out interface{}) error {\n\tkfdef := &kfdeftypes.KfDef{}\n\tkfdef.Name = config.Name\n\tkfdef.Namespace = config.Namespace\n\tkfdef.APIVersion = config.APIVersion\n\tkfdef.Kind = \"KfDef\"\n\tkfdef.Labels = config.Labels\n\tkfdef.Annotations = config.Annotations\n\tkfdef.ClusterName = config.ClusterName\n\n\tkfdef.Spec.AppDir = config.Spec.AppDir\n\tkfdef.Spec.Version = config.Spec.Version\n\tkfdef.Spec.UseBasicAuth = config.Spec.UseBasicAuth\n\t// Should be deprecated, hardcode it just to be safe.\n\tkfdef.Spec.EnableApplications = true\n\tkfdef.Spec.UseIstio = true\n\tkfdef.Spec.PackageManager = \"kustomize\"\n\n\tgcpSpec := &kfgcpplugin.GcpPluginSpec{}\n\tif err := config.GetPluginSpec(kfconfig.GCP_PLUGIN_KIND, gcpSpec); err == nil {\n\t\tkfdef.Spec.Project = gcpSpec.Project\n\t\tkfdef.Spec.Email = gcpSpec.Email\n\t\tkfdef.Spec.IpName = gcpSpec.IpName\n\t\tkfdef.Spec.Hostname = gcpSpec.Hostname\n\t\tkfdef.Spec.Zone = gcpSpec.Zone\n\t\tkfdef.Spec.SkipInitProject = gcpSpec.SkipInitProject\n\t\tkfdef.Spec.DeleteStorage = gcpSpec.DeleteStorage\n\t}\n\n\tfor _, app := range config.Spec.Applications {\n\t\tapplication := kfdeftypes.Application{\n\t\t\tName: app.Name,\n\t\t}\n\t\tif app.KustomizeConfig != nil {\n\t\t\tkconfig := &kfdeftypes.KustomizeConfig{\n\t\t\t\tOverlays: app.KustomizeConfig.Overlays,\n\t\t\t}\n\t\t\tif app.KustomizeConfig.RepoRef != nil {\n\t\t\t\tkref := &kfdeftypes.RepoRef{\n\t\t\t\t\tName: app.KustomizeConfig.RepoRef.Name,\n\t\t\t\t\tPath: app.KustomizeConfig.RepoRef.Path,\n\t\t\t\t}\n\t\t\t\tkconfig.RepoRef = kref\n\t\t\t}\n\t\t\tfor _, param := range app.KustomizeConfig.Parameters {\n\t\t\t\tp := configsv3.NameValue{\n\t\t\t\t\tName:  param.Name,\n\t\t\t\t\tValue: param.Value,\n\t\t\t\t}\n\t\t\t\tkconfig.Parameters = append(kconfig.Parameters, p)\n\t\t\t}\n\t\t\tapplication.KustomizeConfig = kconfig\n\t\t}\n\t\tkfdef.Spec.Applications = append(kfdef.Spec.Applications, application)\n\t}\n\n\tplatform := \"\"\n\tfor _, plugin := range config.Spec.Plugins {\n\t\tp := kfdeftypes.Plugin{\n\t\t\tName: plugin.Name,\n\t\t\tSpec: plugin.Spec,\n\t\t}\n\t\tkfdef.Spec.Plugins = append(kfdef.Spec.Plugins, p)\n\n\t\tif plugin.Name == kftypesv3.AWS {\n\t\t\tplatform = kftypesv3.AWS\n\t\t} else if plugin.Name == kftypesv3.GCP {\n\t\t\tplatform = kftypesv3.GCP\n\t\t}\n\t}\n\tkfdef.Spec.Platform = platform\n\n\tfor _, secret := range config.Spec.Secrets {\n\t\ts := kfdeftypes.Secret{\n\t\t\tName: secret.Name,\n\t\t}\n\t\tif secret.SecretSource != nil {\n\t\t\ts.SecretSource = &kfdeftypes.SecretSource{}\n\t\t\tif secret.SecretSource.LiteralSource != nil {\n\t\t\t\ts.SecretSource.LiteralSource = &kfdeftypes.LiteralSource{\n\t\t\t\t\tValue: secret.SecretSource.LiteralSource.Value,\n\t\t\t\t}\n\t\t\t}\n\t\t\tif secret.SecretSource.EnvSource != nil {\n\t\t\t\ts.SecretSource.EnvSource = &kfdeftypes.EnvSource{\n\t\t\t\t\tName: secret.SecretSource.EnvSource.Name,\n\t\t\t\t}\n\t\t\t}\n\t\t\tif secret.SecretSource.HashedSource != nil {\n\t\t\t\ts.SecretSource.HashedSource = &kfdeftypes.HashedSource{\n\t\t\t\t\tHashedValue: secret.SecretSource.HashedSource.HashedValue,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tkfdef.Spec.Secrets = append(kfdef.Spec.Secrets, s)\n\t}\n\n\tfor _, repo := range config.Spec.Repos {\n\t\tr := kfdeftypes.Repo{\n\t\t\tName: repo.Name,\n\t\t\tUri:  repo.URI,\n\t\t}\n\t\tkfdef.Spec.Repos = append(kfdef.Spec.Repos, r)\n\t}\n\n\tkfdef.Status = kfdeftypes.KfDefStatus{}\n\tfor _, cond := range config.Status.Conditions {\n\t\tc := kfdeftypes.KfDefCondition{\n\t\t\tType:               kfdeftypes.KfDefConditionType(cond.Type),\n\t\t\tStatus:             cond.Status,\n\t\t\tLastUpdateTime:     cond.LastUpdateTime,\n\t\t\tLastTransitionTime: cond.LastTransitionTime,\n\t\t\tReason:             cond.Reason,\n\t\t\tMessage:            cond.Message,\n\t\t}\n\t\tkfdef.Status.Conditions = append(kfdef.Status.Conditions, c)\n\t}\n\n\tkfdef.Status.ReposCache = make(map[string]kfdeftypes.RepoCache)\n\tfor _, cache := range config.Status.Caches {\n\t\tkfdef.Status.ReposCache[cache.Name] = kfdeftypes.RepoCache{\n\t\t\tLocalPath: cache.LocalPath,\n\t\t}\n\t}\n\n\tkfdefBytes, err := yaml.Marshal(kfdef)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error when marshaling to KfDef: %v\", err),\n\t\t}\n\t}\n\n\terr = yaml.Unmarshal(kfdefBytes, out)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error when unmarshaling to KfDef: %v\", err),\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/v1alpha1_test.go",
    "content": "package loaders\n\nimport (\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/google/go-cmp/cmp\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tkfdeftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1alpha1\"\n\tkfgcpplugin \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/gcp/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tkfutils \"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"reflect\"\n\t\"testing\"\n)\n\nfunc TestV1alpha1_ConvertToKfConfigs(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    string\n\t\tExpected string\n\t}\n\n\tcases := []testCase{\n\t\ttestCase{\n\t\t\tInput:    \"v1alpha1.yaml\",\n\t\t\tExpected: \"kfconfig_v1alpha1.yaml\",\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Input)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\t\tvar obj interface{}\n\t\tif err := yaml.Unmarshal(buf, &obj); err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling file %v; error %v\", fPath, err)\n\t\t}\n\n\t\tv1alpha1 := V1alpha1{}\n\t\tconfig, err := v1alpha1.LoadKfConfig(obj)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error converting to KfConfig: %v\", err)\n\t\t}\n\n\t\tePath := path.Join(wd, \"testdata\", c.Expected)\n\t\teBuf, err := ioutil.ReadFile(ePath)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when reading KfConfig: %v\", err)\n\t\t}\n\t\texpectedConfig := &kfconfig.KfConfig{}\n\t\terr = yaml.Unmarshal(eBuf, expectedConfig)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling KfConfig: %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(config, expectedConfig) {\n\t\t\tpGot := kfutils.PrettyPrint(config)\n\t\t\tpWant := kfutils.PrettyPrint(expectedConfig)\n\t\t\tt.Errorf(\"Loaded KfConfig doesn't match: %v\", cmp.Diff(pGot, pWant))\n\t\t}\n\t}\n}\n\nfunc TestV1alpha1_ConvertToKfDef(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    string\n\t\tExpected string\n\t}\n\n\tcases := []testCase{\n\t\ttestCase{\n\t\t\tInput:    \"kfconfig_v1alpha1.yaml\",\n\t\t\tExpected: \"v1alpha1.yaml\",\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Input)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\t\tconfig := &kfconfig.KfConfig{}\n\t\terr := yaml.Unmarshal(buf, config)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling KfConfig: %v\", err)\n\t\t}\n\n\t\tv1alpha1 := V1alpha1{}\n\t\tgot := &kfdeftypes.KfDef{}\n\t\tif err = v1alpha1.LoadKfDef(*config, got); err != nil {\n\t\t\tt.Fatalf(\"Error converting to KfDef: %v\", err)\n\t\t}\n\t\tgcpSpec := &kfgcpplugin.GcpPluginSpec{}\n\t\terr = got.GetPluginSpec(kftypes.GCP, gcpSpec)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when getting spec: %v\", err)\n\t\t}\n\t\tnewSpec := &kfgcpplugin.GcpPluginSpec{}\n\t\tnewSpec.CreatePipelinePersistentStorage = gcpSpec.CreatePipelinePersistentStorage\n\t\tnewSpec.EnableWorkloadIdentity = gcpSpec.EnableWorkloadIdentity\n\t\tnewSpec.DeploymentManagerConfig = gcpSpec.DeploymentManagerConfig\n\t\terr = got.SetPluginSpec(kftypes.GCP, newSpec)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when writing back GcpPluginSpec: %v\", err)\n\t\t}\n\n\t\tePath := path.Join(wd, \"testdata\", c.Expected)\n\t\teBuf, err := ioutil.ReadFile(ePath)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when reading KfDef: %v\", err)\n\t\t}\n\t\twant := &kfdeftypes.KfDef{}\n\t\terr = yaml.Unmarshal(eBuf, want)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling to KfDef: %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(got, want) {\n\t\t\tpGot := kfutils.PrettyPrint(got)\n\t\t\tpWant := kfutils.PrettyPrint(want)\n\t\t\tt.Errorf(\"Loaded KfConfig doesn't match: %v\", cmp.Diff(pGot, pWant))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/v1beta1.go",
    "content": "package loaders\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ghodss/yaml\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkfdeftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfdef/v1beta1\"\n\tkfdefgcpplugin \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/gcp/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n)\n\n// Empty struct - used to implement Converter interface.\ntype V1beta1 struct {\n}\n\nfunc (v V1beta1) LoadKfConfig(def interface{}) (*kfconfig.KfConfig, error) {\n\tkfdef := &kfdeftypes.KfDef{}\n\tif bytes, err := yaml.Marshal(def); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not marshal kfdef into bytes: %v\", err),\n\t\t}\n\t} else {\n\t\terr = yaml.Unmarshal(bytes, kfdef)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"could not unpack kfdef: %v\", err),\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set UseBasicAuth later.\n\tconfig := &kfconfig.KfConfig{\n\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\tUseBasicAuth: false,\n\t\t},\n\t}\n\tconfig.Name = kfdef.Name\n\tconfig.Namespace = kfdef.Namespace\n\tconfig.APIVersion = kfdef.APIVersion\n\tconfig.Kind = \"KfConfig\"\n\tconfig.Labels = kfdef.Labels\n\tconfig.Annotations = kfdef.Annotations\n\tconfig.ClusterName = kfdef.ClusterName\n\tconfig.Spec.Version = kfdef.Spec.Version\n\tfor _, app := range kfdef.Spec.Applications {\n\t\tapplication := kfconfig.Application{\n\t\t\tName: app.Name,\n\t\t}\n\t\tif app.KustomizeConfig != nil {\n\t\t\tkconfig := &kfconfig.KustomizeConfig{\n\t\t\t\tOverlays: app.KustomizeConfig.Overlays,\n\t\t\t}\n\t\t\tif app.KustomizeConfig.RepoRef != nil {\n\t\t\t\tkref := &kfconfig.RepoRef{\n\t\t\t\t\tName: app.KustomizeConfig.RepoRef.Name,\n\t\t\t\t\tPath: app.KustomizeConfig.RepoRef.Path,\n\t\t\t\t}\n\t\t\t\tkconfig.RepoRef = kref\n\n\t\t\t\t// Use application to infer whether UseBasicAuth is true.\n\t\t\t\tif kref.Path == \"common/basic-auth\" {\n\t\t\t\t\tconfig.Spec.UseBasicAuth = true\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, param := range app.KustomizeConfig.Parameters {\n\t\t\t\tp := kfconfig.NameValue{\n\t\t\t\t\tName:  param.Name,\n\t\t\t\t\tValue: param.Value,\n\t\t\t\t}\n\t\t\t\tkconfig.Parameters = append(kconfig.Parameters, p)\n\t\t\t}\n\t\t\tapplication.KustomizeConfig = kconfig\n\t\t}\n\t\tconfig.Spec.Applications = append(config.Spec.Applications, application)\n\t}\n\n\tfor _, plugin := range kfdef.Spec.Plugins {\n\t\tp := kfconfig.Plugin{\n\t\t\tName:      plugin.Name,\n\t\t\tNamespace: kfdef.Namespace,\n\t\t\tKind:      kfconfig.PluginKindType(plugin.Kind),\n\t\t\tSpec:      plugin.Spec,\n\t\t}\n\t\tconfig.Spec.Plugins = append(config.Spec.Plugins, p)\n\n\t\tif plugin.Kind == string(kfconfig.GCP_PLUGIN_KIND) {\n\t\t\tspec := kfdefgcpplugin.GcpPluginSpec{}\n\t\t\tif err := kfdef.GetPluginSpec(plugin.Kind, &spec); err != nil {\n\t\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"could not retrieve GCP plugin spec: %v\", err),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconfig.Spec.Project = spec.Project\n\t\t\tconfig.Spec.Email = spec.Email\n\t\t\tconfig.Spec.IpName = spec.IpName\n\t\t\tconfig.Spec.Hostname = spec.Hostname\n\t\t\tconfig.Spec.SkipInitProject = spec.SkipInitProject\n\t\t\tconfig.Spec.Zone = spec.Zone\n\t\t\tconfig.Spec.DeleteStorage = spec.DeleteStorage\n\t\t}\n\t\tif p := maybeGetPlatform(plugin.Kind); p != \"\" {\n\t\t\tconfig.Spec.Platform = p\n\t\t}\n\t}\n\n\tfor _, secret := range kfdef.Spec.Secrets {\n\t\ts := kfconfig.Secret{\n\t\t\tName: secret.Name,\n\t\t}\n\t\tsrc := &kfconfig.SecretSource{}\n\t\t// kfdef -> kfconfig should keep  literalSource , becasue only kfdef should be checked into source control,\n\t\t// We only filter secrets during kfconfig -> kfdef.\n\t\tif secret.SecretSource.LiteralSource != nil {\n\t\t\tsrc.LiteralSource = &kfconfig.LiteralSource{\n\t\t\t\tValue: secret.SecretSource.LiteralSource.Value,\n\t\t\t}\n\t\t}\n\t\tif secret.SecretSource.EnvSource != nil {\n\t\t\tsrc.EnvSource = &kfconfig.EnvSource{\n\t\t\t\tName: secret.SecretSource.EnvSource.Name,\n\t\t\t}\n\t\t}\n\n\t\ts.SecretSource = src\n\t\tconfig.Spec.Secrets = append(config.Spec.Secrets, s)\n\t}\n\n\tfor _, repo := range kfdef.Spec.Repos {\n\t\tr := kfconfig.Repo{\n\t\t\tName: repo.Name,\n\t\t\tURI:  repo.URI,\n\t\t}\n\t\tconfig.Spec.Repos = append(config.Spec.Repos, r)\n\t}\n\n\tfor _, cond := range kfdef.Status.Conditions {\n\t\tc := kfconfig.Condition{\n\t\t\tType:               kfconfig.ConditionType(cond.Type),\n\t\t\tStatus:             cond.Status,\n\t\t\tLastUpdateTime:     cond.LastUpdateTime,\n\t\t\tLastTransitionTime: cond.LastTransitionTime,\n\t\t\tReason:             cond.Reason,\n\t\t\tMessage:            cond.Message,\n\t\t}\n\t\tconfig.Status.Conditions = append(config.Status.Conditions, c)\n\t}\n\tfor _, cache := range kfdef.Status.ReposCache {\n\t\tc := kfconfig.Cache{\n\t\t\tName:      cache.Name,\n\t\t\tLocalPath: cache.LocalPath,\n\t\t}\n\t\tconfig.Status.Caches = append(config.Status.Caches, c)\n\t}\n\n\treturn config, nil\n}\n\nfunc (v V1beta1) LoadKfDef(config kfconfig.KfConfig, out interface{}) error {\n\tkfdef := &kfdeftypes.KfDef{}\n\tkfdef.Name = config.Name\n\tkfdef.Namespace = config.Namespace\n\tkfdef.APIVersion = config.APIVersion\n\tkfdef.Kind = \"KfDef\"\n\tkfdef.Labels = config.Labels\n\tkfdef.Annotations = config.Annotations\n\tkfdef.ClusterName = config.ClusterName\n\tkfdef.Spec.Version = config.Spec.Version\n\n\tfor _, app := range config.Spec.Applications {\n\t\tapplication := kfdeftypes.Application{\n\t\t\tName: app.Name,\n\t\t}\n\t\tif app.KustomizeConfig != nil {\n\t\t\tkconfig := &kfdeftypes.KustomizeConfig{\n\t\t\t\tOverlays: app.KustomizeConfig.Overlays,\n\t\t\t}\n\t\t\tif app.KustomizeConfig.RepoRef != nil {\n\t\t\t\tkref := &kfdeftypes.RepoRef{\n\t\t\t\t\tName: app.KustomizeConfig.RepoRef.Name,\n\t\t\t\t\tPath: app.KustomizeConfig.RepoRef.Path,\n\t\t\t\t}\n\t\t\t\tkconfig.RepoRef = kref\n\t\t\t}\n\t\t\tfor _, param := range app.KustomizeConfig.Parameters {\n\t\t\t\tp := kfdeftypes.NameValue{\n\t\t\t\t\tName:  param.Name,\n\t\t\t\t\tValue: param.Value,\n\t\t\t\t}\n\t\t\t\tkconfig.Parameters = append(kconfig.Parameters, p)\n\t\t\t}\n\t\t\tapplication.KustomizeConfig = kconfig\n\t\t}\n\t\tkfdef.Spec.Applications = append(kfdef.Spec.Applications, application)\n\t}\n\n\tfor _, plugin := range config.Spec.Plugins {\n\t\tp := kfdeftypes.Plugin{\n\t\t\tSpec: plugin.Spec,\n\t\t}\n\t\tp.Name = plugin.Name\n\t\tp.Kind = string(plugin.Kind)\n\t\tkfdef.Spec.Plugins = append(kfdef.Spec.Plugins, p)\n\t}\n\n\tfor _, secret := range config.Spec.Secrets {\n\t\ts := kfdeftypes.Secret{\n\t\t\tName: secret.Name,\n\t\t}\n\t\tif secret.SecretSource != nil {\n\t\t\ts.SecretSource = &kfdeftypes.SecretSource{}\n\t\t\t// We don't want to store literalSource explictly, becasue we want the config to be checked into source control and don't want secrets in source control.\n\t\t\tif secret.SecretSource.EnvSource != nil {\n\t\t\t\ts.SecretSource.EnvSource = &kfdeftypes.EnvSource{\n\t\t\t\t\tName: secret.SecretSource.EnvSource.Name,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tkfdef.Spec.Secrets = append(kfdef.Spec.Secrets, s)\n\t}\n\n\tfor _, repo := range config.Spec.Repos {\n\t\tr := kfdeftypes.Repo{\n\t\t\tName: repo.Name,\n\t\t\tURI:  repo.URI,\n\t\t}\n\t\tkfdef.Spec.Repos = append(kfdef.Spec.Repos, r)\n\t}\n\n\tfor _, cond := range config.Status.Conditions {\n\t\tc := kfdeftypes.KfDefCondition{\n\t\t\tType:               kfdeftypes.KfDefConditionType(cond.Type),\n\t\t\tStatus:             cond.Status,\n\t\t\tLastUpdateTime:     cond.LastUpdateTime,\n\t\t\tLastTransitionTime: cond.LastTransitionTime,\n\t\t\tReason:             cond.Reason,\n\t\t\tMessage:            cond.Message,\n\t\t}\n\t\tkfdef.Status.Conditions = append(kfdef.Status.Conditions, c)\n\t}\n\n\tfor _, cache := range config.Status.Caches {\n\t\tc := kfdeftypes.RepoCache{\n\t\t\tName:      cache.Name,\n\t\t\tLocalPath: cache.LocalPath,\n\t\t}\n\t\tkfdef.Status.ReposCache = append(kfdef.Status.ReposCache, c)\n\t}\n\n\tkfdefBytes, err := yaml.Marshal(kfdef)\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error when marshaling to KfDef: %v\", err),\n\t\t}\n\t}\n\n\terr = yaml.Unmarshal(kfdefBytes, out)\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"error when unmarshaling to KfDef: %v\", err),\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/kfconfig/loaders/v1beta1_test.go",
    "content": "package loaders\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tkfutils \"github.com/kubeflow/kfctl/v3/pkg/utils\"\n)\n\nfunc TestV1beta1_expectedConfig(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    string\n\t\tExpected string\n\t}\n\n\tcases := []testCase{\n\t\ttestCase{\n\t\t\tInput:    \"v1beta1.yaml\",\n\t\t\tExpected: \"kfconfig_v1beta1.yaml\",\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Input)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\t\tvar obj interface{}\n\t\tif err := yaml.Unmarshal(buf, &obj); err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling file %v; error %v\", fPath, err)\n\t\t}\n\n\t\tv1beta1 := V1beta1{}\n\t\tconfig, err := v1beta1.LoadKfConfig(obj)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error converting to KfConfig: %v\", err)\n\t\t}\n\n\t\tePath := path.Join(wd, \"testdata\", c.Expected)\n\t\teBuf, err := ioutil.ReadFile(ePath)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when reading KfConfig: %v\", err)\n\t\t}\n\t\texpectedConfig := &kfconfig.KfConfig{}\n\t\terr = yaml.Unmarshal(eBuf, expectedConfig)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error when unmarshaling KfConfig: %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(config, expectedConfig) {\n\t\t\tpGot := kfutils.PrettyPrint(config)\n\t\t\tpWant := kfutils.PrettyPrint(expectedConfig)\n\t\t\tt.Errorf(\"Loaded KfConfig doesn't match %v\", cmp.Diff(pGot, pWant))\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "pkg/kfconfig/register.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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// NOTE: Boilerplate only.  Ignore this file.\n\n// Package v1alpha1 contains API Schema definitions for the kfdef v1alpha1 API group\n// +k8s:openapi-gen=true\n// +k8s:deepcopy-gen=package,register\n// +k8s:conversion-gen=github.com/kubeflow/kfctl/v3/pkg/kfconfig\n// +k8s:defaulter-gen=TypeMeta\n// +groupName=kfconfig.apps.kubeflow.org\npackage kfconfig\n\nimport (\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"k8s.io/apimachinery/pkg/runtime/schema\"\n\tutilruntime \"k8s.io/apimachinery/pkg/util/runtime\"\n\t\"k8s.io/client-go/kubernetes/scheme\"\n)\n\nvar (\n\t// SchemeGroupVersion is group version used to register these objects\n\tSchemeGroupVersion = schema.GroupVersion{Group: \"kfconfig.apps.kubeflow.org\", Version: \"v1alpha1\"}\n\n\t// SchemeBuilder is used to add go types to the GroupVersionKind scheme\n\tSchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)\n\tlocalSchemeBuilder = &SchemeBuilder\n\n\t// AddToScheme is required by pkg/kfdef/...\n\tAddToScheme = localSchemeBuilder.AddToScheme\n)\n\n// Resource is required by pkg/kfdef/listers/...\nfunc Resource(resource string) schema.GroupResource {\n\treturn SchemeGroupVersion.WithResource(resource).GroupResource()\n}\n\nfunc addKnownTypes(scheme *runtime.Scheme) error {\n\tscheme.AddKnownTypes(SchemeGroupVersion,\n\t\t&KfConfig{},\n\t)\n\tmetav1.AddToGroupVersion(scheme, SchemeGroupVersion)\n\treturn nil\n}\n\nfunc init() {\n\tmetav1.AddToGroupVersion(scheme.Scheme, SchemeGroupVersion)\n\tutilruntime.Must(AddToScheme(scheme.Scheme))\n}\n"
  },
  {
    "path": "pkg/kfconfig/testdata/doc.go",
    "content": "package testdata\n\n"
  },
  {
    "path": "pkg/kfconfig/testdata/kfctl_plugin_test.yaml",
    "content": "apiVersion: kfdef.apps.kubeflow.org/v1beta1\nkind: KfConfig\nspec:\n  applications:\n    - name: delete\n    - name: keep\n  plugins:\n    - kind: fakeplugin\n      spec:\n        param: someparam\n        boolParam: true\n"
  },
  {
    "path": "pkg/kfconfig/types.go",
    "content": "package kfconfig\n\nimport (\n\t\"archive/tar\"\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"github.com/ghodss/yaml\"\n\tgogetter \"github.com/hashicorp/go-getter\"\n\t\"github.com/hashicorp/go-getter/helper/url\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/otiai10/copy\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/types\"\n\t\"strings\"\n)\n\nconst (\n\tDefaultCacheDir = \".cache\"\n\t// KfAppsStackName is the name that should be assigned to the application corresponding to the kubeflow\n\t// application stack.\n\tKfAppsStackName = \"kubeflow-apps\"\n\tKustomizeDir    = \"kustomize\"\n)\n\n// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object\n\n// Internal data structure to hold app related info.\n// +k8s:openapi-gen=true\ntype KfConfig struct {\n\tmetav1.TypeMeta   `json:\",inline\"`\n\tmetav1.ObjectMeta `json:\"metadata,omitempty\"`\n\n\tSpec   KfConfigSpec `json:\"spec,omitempty\"`\n\tStatus Status       `json:\"status,omitempty\"`\n}\n\n// The spec of kKfConfig\ntype KfConfigSpec struct {\n\t// Shared fields among all components. should limit this list.\n\t// TODO(gabrielwen): Deprecate AppDir and move it to cache in Status.\n\tAppDir string `json:\"appDir,omitempty\"`\n\t// The filename of the config, e.g. app.yaml.\n\t// Base name only, as the directory is AppDir above.\n\tConfigFileName string `json:\"configFileName,omitempty\"`\n\n\tVersion string `json:\"version,omitempty\"`\n\n\t// TODO(gabrielwen): Can we infer this from Applications?\n\tUseBasicAuth bool `json:\"useBasicAuth,omitempty\"`\n\n\tPlatform string `json:\"platform,omitempty\"`\n\n\t// TODO(gabrielwen): Deprecate these fields as they only makes sense to GCP.\n\tProject         string `json:\"project,omitempty\"`\n\tEmail           string `json:\"email,omitempty\"`\n\tIpName          string `json:\"ipName,omitempty\"`\n\tHostname        string `json:\"hostname,omitempty\"`\n\tSkipInitProject bool   `json:\"skipInitProject,omitempty\"`\n\tZone            string `json:\"zone,omitempty\"`\n\n\tDeleteStorage bool `json:\"deleteStorage,omitempty\"`\n\n\tApplications []Application `json:\"applications,omitempty\"`\n\tPlugins      []Plugin      `json:\"plugins,omitempty\"`\n\tSecrets      []Secret      `json:\"secrets,omitempty\"`\n\tRepos        []Repo        `json:\"repos,omitempty\"`\n}\n\n// Application defines an application to install\ntype Application struct {\n\tName            string           `json:\"name,omitempty\"`\n\tKustomizeConfig *KustomizeConfig `json:\"kustomizeConfig,omitempty\"`\n}\n\ntype KustomizeConfig struct {\n\tRepoRef    *RepoRef    `json:\"repoRef,omitempty\"`\n\tOverlays   []string    `json:\"overlays,omitempty\"`\n\tParameters []NameValue `json:\"parameters,omitempty\"`\n}\n\ntype RepoRef struct {\n\tName string `json:\"name,omitempty\"`\n\tPath string `json:\"path,omitempty\"`\n}\n\ntype NameValue struct {\n\tName  string `json:\"name,omitempty\"`\n\tValue string `json:\"value,omitempty\"`\n}\n\ntype Plugin struct {\n\tName      string                `json:\"name,omitempty\"`\n\tNamespace string                `json:\"namespace,omitempty\"`\n\tKind      PluginKindType        `json:\"kind,omitempty\"`\n\tSpec      *runtime.RawExtension `json:\"spec,omitempty\"`\n}\n\n// Secret provides information about secrets needed to configure Kubeflow.\n// Secrets can be provided via references.\ntype Secret struct {\n\tName         string        `json:\"name,omitempty\"`\n\tSecretSource *SecretSource `json:\"secretSource,omitempty\"`\n}\n\ntype SecretSource struct {\n\tLiteralSource *LiteralSource `json:\"literalSource,omitempty\"`\n\tHashedSource  *HashedSource  `json:\"hashedSource,omitempty\"`\n\tEnvSource     *EnvSource     `json:\"envSource,omitempty\"`\n}\n\ntype LiteralSource struct {\n\tValue string `json:\"value,omitempty\"`\n}\n\ntype HashedSource struct {\n\tHashedValue string `json:\"value,omitempty\"`\n}\n\ntype EnvSource struct {\n\tName string `json:\"name,omitempty\"`\n}\n\n// SecretRef is a reference to a secret\ntype SecretRef struct {\n\t// Name of the secret\n\tName string `json:\"name,omitempty\"`\n}\n\n// Repo provides information about a repository providing config (e.g. kustomize packages,\n// Deployment manager configs, etc...)\ntype Repo struct {\n\t// Name is a name to identify the repository.\n\tName string `json:\"name,omitempty\"`\n\t// URI where repository can be obtained.\n\t// Can use any URI understood by go-getter:\n\t// https://github.com/hashicorp/go-getter/blob/master/README.md#installation-and-usage\n\tURI string `json:\"uri,omitempty\"`\n}\n\ntype Status struct {\n\tConditions []Condition `json:\"conditions,omitempty\"`\n\tCaches     []Cache     `json:\"caches,omitempty\"`\n}\n\ntype Condition struct {\n\t// Type of deployment condition.\n\tType ConditionType `json:\"type,omitempty\"`\n\t// Status of the condition, one of True, False, Unknown.\n\tStatus v1.ConditionStatus `json:\"status,omitempty\"`\n\t// The last time this condition was updated.\n\tLastUpdateTime metav1.Time `json:\"lastUpdateTime,omitempty\"`\n\t// Last time the condition transitioned from one status to another.\n\tLastTransitionTime metav1.Time `json:\"lastTransitionTime,omitempty\"`\n\t// The reason for the condition's last transition.\n\tReason string `json:\"reason,omitempty\"`\n\t// A human readable message indicating details about the transition.\n\tMessage string `json:\"message,omitempty\"`\n}\n\ntype Cache struct {\n\tName      string `json:\"name,omitempty\"`\n\tLocalPath string `json:\"localPath,omitempty\"`\n}\n\ntype PluginKindType string\n\nconst (\n\t// Used for populating plugin missing errors and identifying those\n\t// errors.\n\tpluginNotFoundErrPrefix = \"Missing plugin\"\n\n\t// Used for populating plugin missing errors and identifying those\n\t// errors.\n\tconditionNotFoundErrPrefix = \"Missing condition\"\n)\n\n// Plugin kind used starting from v1beta1\nconst (\n\tAWS_PLUGIN_KIND              PluginKindType = \"KfAwsPlugin\"\n\tGCP_PLUGIN_KIND              PluginKindType = \"KfGcpPlugin\"\n\tMINIKUBE_PLUGIN_KIND         PluginKindType = \"KfMinikubePlugin\"\n\tEXISTING_ARRIKTO_PLUGIN_KIND PluginKindType = \"KfExistingArriktoPlugin\"\n)\n\ntype ConditionType string\n\nconst (\n\t// Available means Kubeflow is serving.\n\tAvailable ConditionType = \"Available\"\n\n\t// Degraded means one or more Kubeflow services are not healthy.\n\tDegraded ConditionType = \"Degraded\"\n\n\t// Pending means Kubeflow services is being updated.\n\tPending ConditionType = \"Pending\"\n)\n\n// Define plugin related conditions to be the format:\n// - conditions for successful plugins: ${PluginKind}Succeeded\n// - conditions for failed plugins: ${PluginKind}Failed\nfunc GetPluginSucceededCondition(pluginKind PluginKindType) ConditionType {\n\treturn ConditionType(fmt.Sprintf(\"%vSucceeded\", pluginKind))\n}\nfunc GetPluginFailedCondition(pluginKind PluginKindType) ConditionType {\n\treturn ConditionType(fmt.Sprintf(\"%vFailed\", pluginKind))\n}\n\n// Returns the repo with the name and true if repo exists.\n// nil and false otherwise.\nfunc (c *KfConfig) GetRepoCache(repoName string) (Cache, bool) {\n\tfor _, r := range c.Status.Caches {\n\t\tif r.Name == repoName {\n\t\t\treturn r, true\n\t\t}\n\t}\n\treturn Cache{}, false\n}\n\nfunc (c *KfConfig) GetPluginSpec(pluginKind PluginKindType, s interface{}) error {\n\tfor _, p := range c.Spec.Plugins {\n\t\tif p.Kind != pluginKind {\n\t\t\tcontinue\n\t\t}\n\n\t\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t\t// and then unserialize it.\n\t\tspecBytes, err := yaml.Marshal(p.Spec)\n\t\tif err != nil {\n\t\t\tmsg := fmt.Sprintf(\"Could not marshal plugin %v args; error %v\", pluginKind, err)\n\t\t\tlog.Errorf(msg)\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: msg,\n\t\t\t}\n\t\t}\n\t\terr = yaml.Unmarshal(specBytes, s)\n\t\tif err != nil {\n\t\t\tmsg := fmt.Sprintf(\"Could not unmarshal plugin %v to the provided type; error %v\", pluginKind, err)\n\t\t\tlog.Errorf(msg)\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: msg,\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\treturn &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"%v %v\", pluginNotFoundErrPrefix, pluginKind),\n\t}\n}\n\n// SetPluginSpec sets the requested parameter: add the plugin if it doesn't already exist, or replace existing plugin.\nfunc (c *KfConfig) SetPluginSpec(pluginKind PluginKindType, spec interface{}) error {\n\t// Convert spec to RawExtension\n\tr := &runtime.RawExtension{}\n\n\t// To deserialize it to a specific type we need to first serialize it to bytes\n\t// and then unserialize it.\n\tspecBytes, err := yaml.Marshal(spec)\n\n\tif err != nil {\n\t\tmsg := fmt.Sprintf(\"Could not marshal spec; error %v\", err)\n\t\tlog.Errorf(msg)\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: msg,\n\t\t}\n\t}\n\n\terr = yaml.Unmarshal(specBytes, r)\n\n\tif err != nil {\n\t\tmsg := fmt.Sprintf(\"Could not unmarshal plugin to RawExtension; error %v\", err)\n\t\tlog.Errorf(msg)\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: msg,\n\t\t}\n\t}\n\n\tindex := -1\n\n\tfor i, p := range c.Spec.Plugins {\n\t\tif p.Kind == pluginKind {\n\t\t\tindex = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif index == -1 {\n\t\t// Plugin in doesn't exist so add it\n\t\tlog.Infof(\"Adding plugin %v\", pluginKind)\n\n\t\tp := Plugin{}\n\t\tp.Name = string(pluginKind)\n\t\tp.Kind = pluginKind\n\t\tc.Spec.Plugins = append(c.Spec.Plugins, p)\n\n\t\tindex = len(c.Spec.Plugins) - 1\n\t}\n\n\tc.Spec.Plugins[index].Spec = r\n\treturn nil\n}\n\n// Sets condition and status to KfConfig.\nfunc (c *KfConfig) SetCondition(condType ConditionType,\n\tstatus v1.ConditionStatus,\n\treason string,\n\tmessage string) {\n\tnow := metav1.Now()\n\tcond := Condition{\n\t\tType:               condType,\n\t\tStatus:             status,\n\t\tLastUpdateTime:     now,\n\t\tLastTransitionTime: now,\n\t\tReason:             reason,\n\t\tMessage:            message,\n\t}\n\n\tfor i := range c.Status.Conditions {\n\t\tif c.Status.Conditions[i].Type != condType {\n\t\t\tcontinue\n\t\t}\n\t\tif c.Status.Conditions[i].Status == status {\n\t\t\tcond.LastTransitionTime = c.Status.Conditions[i].LastTransitionTime\n\t\t}\n\t\tc.Status.Conditions[i] = cond\n\t\treturn\n\t}\n\tc.Status.Conditions = append(c.Status.Conditions, cond)\n}\n\n// Gets condition from KfConfig.\nfunc (c *KfConfig) GetCondition(condType ConditionType) (*Condition, error) {\n\tfor i := range c.Status.Conditions {\n\t\tif c.Status.Conditions[i].Type == condType {\n\t\t\treturn &c.Status.Conditions[i], nil\n\t\t}\n\t}\n\treturn nil, &kfapis.KfError{\n\t\tCode:    int(kfapis.NOT_FOUND),\n\t\tMessage: fmt.Sprintf(\"%v %v\", conditionNotFoundErrPrefix, condType),\n\t}\n}\n\nfunc (c *KfConfig) IsPluginFinished(pluginKind PluginKindType) bool {\n\tcondType := GetPluginSucceededCondition(pluginKind)\n\tcond, err := c.GetCondition(condType)\n\tif err != nil {\n\t\tif IsConditionNotFound(err) {\n\t\t\treturn false\n\t\t}\n\t\tlog.Warnf(\"Error when getting condition info: %v\", err)\n\t\treturn false\n\t}\n\treturn cond.Status == v1.ConditionTrue\n}\n\nfunc (c *KfConfig) SetPluginFinished(pluginKind PluginKindType, msg string) {\n\tsucceededCond := GetPluginSucceededCondition(pluginKind)\n\tfailedCond := GetPluginFailedCondition(pluginKind)\n\tif _, err := c.GetCondition(failedCond); err == nil {\n\t\tc.SetCondition(failedCond, v1.ConditionFalse, \"\",\n\t\t\t\"Reset to false as the plugin is set to be finished.\")\n\t}\n\n\tc.SetCondition(succeededCond, v1.ConditionTrue, \"\", msg)\n}\n\nfunc (c *KfConfig) IsPluginFailed(pluginKind PluginKindType) bool {\n\tcondType := GetPluginFailedCondition(pluginKind)\n\tcond, err := c.GetCondition(condType)\n\tif err != nil {\n\t\tif IsConditionNotFound(err) {\n\t\t\treturn false\n\t\t}\n\t\tlog.Warnf(\"Error when getting condition info: %v\", err)\n\t\treturn false\n\t}\n\treturn cond.Status == v1.ConditionTrue\n}\n\nfunc (c *KfConfig) SetPluginFailed(pluginKind PluginKindType, msg string) {\n\tsucceededCond := GetPluginSucceededCondition(pluginKind)\n\tfailedCond := GetPluginFailedCondition(pluginKind)\n\tif _, err := c.GetCondition(succeededCond); err == nil {\n\t\tc.SetCondition(succeededCond, v1.ConditionFalse,\n\t\t\t\"\", \"Reset to false as the plugin is set to be failed.\")\n\t}\n\n\tc.SetCondition(failedCond, v1.ConditionTrue, \"\", msg)\n}\n\n// SyncCache will synchronize the local cache of any repositories.\n// On success the status is updated with pointers to the cache.\n//\n// TODO(jlewi): I'm not sure this handles head references correctly.\n// e.g. suppose we have a URI like\n// https://github.com/kubeflow/manifests/tarball/pull/189/head?archive=tar.gz\n// This gets unpacked to: kubeflow-manifests-e2c1bcb where e2c1bcb is the commit.\n// I don't think the code is currently setting the local directory for the cache correctly in\n// that case.\n//\n//\n// Using tarball vs. archive in github links affects the download path\n// e.g.\n// https://github.com/kubeflow/manifests/tarball/master?archive=tar.gz\n//    unpacks to  kubeflow-manifests-${COMMIT}\n// https://github.com/kubeflow/manifests/archive/master.tar.gz\n//    unpacks to manifests-master\n// Always use archive format so that the path is predetermined.\n//\n// Instructions: https://github.com/hashicorp/go-getter#protocol-specific-options\n//\n// What is the correct syntax for downloading pull requests?\n// The following doesn't seem to work\n// https://github.com/kubeflow/manifests/archive/master.tar.gz?ref=pull/188\n//   * Appears to download master\n//\n// This appears to work\n// https://github.com/kubeflow/manifests/tarball/pull/188/head?archive=tar.gz\n// But unpacks it into\n// kubeflow-manifests-${COMMIT}\n//\nfunc (c *KfConfig) SyncCache() error {\n\tif c.Spec.AppDir == \"\" {\n\t\treturn fmt.Errorf(\"AppDir must be specified\")\n\t}\n\n\tappDir := c.Spec.AppDir\n\t// Loop over all the repos and download them.\n\t// TODO(https://github.com/kubeflow/kubeflow/issues/3545): We should check if we already have a local copy and\n\t// not redownload it.\n\n\tbaseCacheDir := path.Join(appDir, DefaultCacheDir)\n\tif _, err := os.Stat(baseCacheDir); os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating directory %v\", baseCacheDir)\n\t\tappdirErr := os.MkdirAll(baseCacheDir, os.ModePerm)\n\t\tif appdirErr != nil {\n\t\t\tlog.Errorf(\"Couldn't create directory %v: %v\", baseCacheDir, appdirErr)\n\t\t\treturn appdirErr\n\t\t}\n\t}\n\n\tfor _, r := range c.Spec.Repos {\n\t\tcacheDir := path.Join(baseCacheDir, r.Name)\n\n\t\t// Can we use a checksum or other mechanism to verify if the existing location is good?\n\t\t// If there was a problem the first time around then removing it might provide a way to recover.\n\t\tif _, err := os.Stat(cacheDir); err == nil {\n\t\t\t// Check if the cache is up to date.\n\t\t\tshouldSkip := false\n\t\t\tfor _, cache := range c.Status.Caches {\n\t\t\t\tif cache.Name == r.Name && cache.LocalPath != \"\" {\n\t\t\t\t\tshouldSkip = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif shouldSkip {\n\t\t\t\tlog.Infof(\"%v exists; not resyncing \", cacheDir)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlog.Infof(\"Deleting cachedir %v because Status.ReposCache is out of date\", cacheDir)\n\n\t\t\t// TODO(jlewi): The reason the cachedir might exist but not be stored in KfDef.status\n\t\t\t// is because of a backwards compatibility path in which we download the cache to construct\n\t\t\t// the KfDef. Specifically coordinator.CreateKfDefFromOptions is calling kftypes.DownloadFromCache\n\t\t\t// We don't want to rely on that method to set the cache because we have logic\n\t\t\t// below to set LocalPath that we don't want to duplicate.\n\t\t\t// Unfortunately this means we end up fetching the repo twice which is very inefficient.\n\t\t\tif err := os.RemoveAll(cacheDir); err != nil {\n\t\t\t\tlog.Errorf(\"There was a problem deleting directory %v; error %v\", cacheDir, err)\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\t\t}\n\n\t\tu, err := url.Parse(r.URI)\n\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Could not parse URI %v; error %v\", r.URI, err)\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tlog.Infof(\"Fetching %v to %v\", r.URI, cacheDir)\n\t\tfu, err := gogetter.Detect(r.URI, \"\", gogetter.Detectors)\n\t\t// from gogetter.getForcedGetter\n\t\tvar forcedRegexp = regexp.MustCompile(`^([A-Za-z0-9]+)::(.+)$`)\n\t\t// uri is in go-getter format (i.e. not http, may also handle local)\n\t\tif ms := forcedRegexp.FindStringSubmatch(fu); ms != nil {\n\t\t\ttarballUrlErr := gogetter.GetAny(cacheDir, fu)\n\t\t\tif tarballUrlErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't download URI %v Error %v\", fu, tarballUrlErr),\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif err := os.MkdirAll(cacheDir, os.ModePerm); err != nil {\n\t\t\t\tlog.Errorf(\"Could not create dir %v; error %v\", cacheDir, err)\n\t\t\t\treturn errors.WithStack(err)\n\t\t\t}\n\n\t\t\t// Manifests are local dir\n\t\t\tif fi, err := os.Stat(r.URI); err == nil && fi.Mode().IsDir() {\n\t\t\t\t// check whether the cache directory is a sub directory of manifests\n\t\t\t\tabsCacheDir, err := filepath.Abs(cacheDir)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn errors.WithStack(err)\n\t\t\t\t}\n\n\t\t\t\tabsURI, err := filepath.Abs(r.URI)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn errors.WithStack(err)\n\t\t\t\t}\n\n\t\t\t\trelDir, err := filepath.Rel(absURI, absCacheDir)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn errors.WithStack(err)\n\t\t\t\t}\n\n\t\t\t\tif !strings.HasPrefix(relDir, \"..\"+string(filepath.Separator)) {\n\t\t\t\t\treturn errors.WithStack(errors.New(\"SyncCache: could not sync cache when the cache path \" + cacheDir + \" is sub directory of manifests \" + r.URI))\n\t\t\t\t}\n\n\t\t\t\tif err := copy.Copy(r.URI, cacheDir); err != nil {\n\t\t\t\t\treturn errors.WithStack(err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tt := &http.Transport{\n\t\t\t\t\tProxy: http.ProxyFromEnvironment,\n\t\t\t\t}\n\t\t\t\tt.RegisterProtocol(\"file\", http.NewFileTransport(http.Dir(\"/\")))\n\t\t\t\tt.RegisterProtocol(\"\", http.NewFileTransport(http.Dir(\"/\")))\n\t\t\t\thclient := &http.Client{Transport: t}\n\t\t\t\treq, _ := http.NewRequest(\"GET\", r.URI, nil)\n\t\t\t\treq.Header.Set(\"User-Agent\", \"kfctl\")\n\t\t\t\tresp, err := hclient.Do(req)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't download URI %v : %v\", r.URI, err),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdefer resp.Body.Close()\n\n\t\t\t\tbody, err := ioutil.ReadAll(resp.Body)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Errorf(\"Could not read response body; error %v\", err)\n\t\t\t\t\treturn errors.WithStack(err)\n\t\t\t\t}\n\t\t\t\tif err := untar(body, cacheDir); err != nil {\n\t\t\t\t\tlog.Errorf(\"Could not untar file %v; error %v\", r.URI, err)\n\t\t\t\t\treturn errors.WithStack(err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// This is a bit of a hack to deal with the fact that GitHub tarballs\n\t\t// can unpack to a directory containing the commit.\n\t\tlocalPath := cacheDir\n\t\tfiles, filesErr := ioutil.ReadDir(cacheDir)\n\t\tif filesErr != nil {\n\t\t\tlog.Errorf(\"Error reading cachedir; error %v\", filesErr)\n\t\t\treturn errors.WithStack(filesErr)\n\t\t}\n\t\tif u.Scheme == \"http\" || u.Scheme == \"https\" {\n\t\t\tsubdir := files[0].Name()\n\t\t\tlocalPath = path.Join(cacheDir, subdir)\n\t\t\tlog.Infof(\"Updating localPath to %v\", localPath)\n\t\t} else if u.Scheme == \"file\" {\n\t\t\tfilePath := strings.TrimPrefix(r.URI, \"file:\")\n\t\t\tlog.Infof(\"Probing file path: %v\", filePath)\n\t\t\tif fileInfo, err := os.Stat(filePath); err != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't stat the path %v: %v\", filePath, err),\n\t\t\t\t}\n\t\t\t} else if !fileInfo.IsDir() {\n\t\t\t\tsubdir := files[0].Name()\n\t\t\t\tlocalPath = path.Join(cacheDir, subdir)\n\t\t\t\tlog.Infof(\"Updating localPath to %v\", localPath)\n\t\t\t}\n\t\t}\n\n\t\tc.Status.Caches = append(c.Status.Caches, Cache{\n\t\t\tName:      r.Name,\n\t\t\tLocalPath: localPath,\n\t\t})\n\n\t\tlog.Infof(\"Fetch succeeded; LocalPath %v\", localPath)\n\t}\n\treturn nil\n}\n\nfunc untar(body []byte, cacheDir string) error {\n\tgzf, err := gzip.NewReader(bytes.NewReader(body))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttarReader := tar.NewReader(gzf)\n\tfor {\n\t\theader, err := tarReader.Next()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif header == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\ttarget := filepath.Join(cacheDir, header.Name)\n\n\t\tswitch header.Typeflag {\n\n\t\tcase tar.TypeDir:\n\t\t\tif _, err := os.Stat(target); err != nil {\n\t\t\t\tif err := os.MkdirAll(target, 0755); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase tar.TypeReg:\n\t\t\tf, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif _, err := io.Copy(f, tarReader); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif err := f.Close(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// GetSecret returns the specified secret or an error if the secret isn't specified.\nfunc (c *KfConfig) GetSecret(name string) (string, error) {\n\tfor _, s := range c.Spec.Secrets {\n\t\tif s.Name != name {\n\t\t\tcontinue\n\t\t}\n\t\tif s.SecretSource.LiteralSource != nil {\n\t\t\treturn s.SecretSource.LiteralSource.Value, nil\n\t\t}\n\t\tif s.SecretSource.HashedSource != nil {\n\t\t\treturn s.SecretSource.HashedSource.HashedValue, nil\n\t\t}\n\t\tif s.SecretSource.EnvSource != nil {\n\t\t\treturn os.Getenv(s.SecretSource.EnvSource.Name), nil\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"No secret source provided for secret %v\", name)\n\t}\n\treturn \"\", NewSecretNotFound(name)\n}\n\n// GetSecretSource returns the SecretSource of the specified name or an error if the secret isn't specified.\nfunc (c *KfConfig) GetSecretSource(name string) (*SecretSource, error) {\n\tfor _, s := range c.Spec.Secrets {\n\t\tif s.Name == name {\n\t\t\treturn s.SecretSource, nil\n\t\t}\n\t}\n\treturn nil, NewSecretNotFound(name)\n}\n\n// GetApplicationParameter gets the desired application parameter.\nfunc (c *KfConfig) GetApplicationParameter(appName string, paramName string) (string, bool) {\n\t// First we check applications for an application with the specified name.\n\tif c.Spec.Applications != nil {\n\t\tfor _, a := range c.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\treturn getParameter(a.KustomizeConfig.Parameters, paramName)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn \"\", false\n}\n\n// addPatchStratgicMerge adds the patchFile to the strategic merge if it isn't already present.\n// Returns true if it is added\nfunc addPatchStratgicMerge(k *types.Kustomization, patchFile string) bool {\n\tfor _, p := range k.PatchesStrategicMerge {\n\t\tif string(p) == patchFile {\n\t\t\tlog.Infof(\"kustomization already defines a patch for %v\", patchFile)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tk.PatchesStrategicMerge = append(k.PatchesStrategicMerge, types.PatchStrategicMerge(patchFile))\n\n\treturn true\n}\n\n// setApplicationParameterInConfigMap sets an application parameter by creatign or modifying a configMap\n// generator.\n// kustomizeDir: Directory of the kustomize application\n// appName: Name of the application\n// paramName: Name of the parameter\n// value: Value of the parameter\n//\n// N.B. In the YAML for the generated config map patch the creationTimeStamp is set to null. This appears to\n// be the result of how the struct is serialized. Hopefully having this field in the output doesn't cause problems\n// with kustomize and kubectl.\nfunc setApplicationParameterInConfigMap(kustomizeDir string, appName string, paramName string, value string) error {\n\tif _, err := os.Stat(kustomizeDir); err == nil {\n\t\t// Noop if the directory already exists.\n\t} else if os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating kustomize directory %v\", kustomizeDir)\n\t\tif err := os.MkdirAll(kustomizeDir, os.ModePerm); err != nil {\n\t\t\treturn errors.WithStack(errors.Wrapf(err, \"Could not create directory: %v\", kustomizeDir))\n\t\t}\n\t} else {\n\t\tlog.Errorf(\"Error checking directory %v; error %v\", kustomizeDir, err)\n\t\treturn errors.WithStack(err)\n\t}\n\n\tkustomizationFile := filepath.Join(kustomizeDir, kftypesv3.KustomizationFile)\n\n\tcontents, err := ioutil.ReadFile(kustomizationFile)\n\n\tk := &types.Kustomization{}\n\n\t// The kustomization file may not exist yet in which case we keep going because we will just create it.\n\tif err == nil {\n\t\tif err := yaml.Unmarshal(contents, k); err != nil {\n\t\t\treturn errors.WithStack(errors.Wrapf(err, \"Failed to unmashal kustomization.yaml: %v\", kustomizationFile))\n\t\t}\n\t} else if err != nil && !os.IsNotExist(err) {\n\t\treturn errors.WithStack(errors.Wrapf(err, \"Failed to read: %v\", kustomizationFile))\n\t}\n\n\tconfigMapFileName := appName + \"-config.yaml\"\n\n\tif addPatchStratgicMerge(k, configMapFileName) {\n\t\tyaml, err := yaml.Marshal(k)\n\n\t\tif err != nil {\n\t\t\treturn errors.WithStack(errors.Wrapf(err, \"Error trying to marshal kustomization for kubeflow application: %v\", appName))\n\t\t}\n\n\t\tkustomizationFileErr := ioutil.WriteFile(kustomizationFile, yaml, 0644)\n\t\tif kustomizationFileErr != nil {\n\t\t\treturn errors.WithStack(errors.Wrapf(kustomizationFileErr, \"Error writing file: %v\", kustomizationFile))\n\t\t}\n\t}\n\n\t// Patch the parameter into the configmap.\n\tc := &v1.ConfigMap{\n\t\tTypeMeta: metav1.TypeMeta{\n\t\t\tAPIVersion: \"v1\",\n\t\t\tKind:       \"ConfigMap\",\n\t\t},\n\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\tName:              appName + \"-config\",\n\t\t\tCreationTimestamp: metav1.Time{},\n\t\t},\n\t}\n\n\tconfigMapPath := filepath.Join(kustomizeDir, configMapFileName)\n\tif contents, err := ioutil.ReadFile(configMapPath); err == nil {\n\t\tif err := yaml.Unmarshal(contents, c); err != nil {\n\t\t\treturn errors.WithStack(errors.Wrapf(err, \"Error reading configmap from file: %v\", configMapPath))\n\t\t}\n\t} else if !os.IsNotExist(err) {\n\t\treturn errors.WithStack(errors.Wrapf(err, \"Error trying to read file: %v\", configMapPath))\n\t}\n\n\tif c.Data == nil {\n\t\tc.Data = map[string]string{}\n\t}\n\tc.Data[paramName] = value\n\n\tnewContents, err := yaml.Marshal(c)\n\n\tif err != nil {\n\t\treturn errors.WithStack(errors.Wrapf(err, \"Error while marshaling patch for configMap %v\", configMapPath))\n\t}\n\n\tif err := ioutil.WriteFile(configMapPath, newContents, os.ModePerm); err != nil {\n\t\treturn errors.WithStack(errors.Wrapf(err, \"Error while writing patch file: %v\", configMapPath))\n\t}\n\n\treturn nil\n}\n\n// legacySetApplicationParameter sets the desired application parameter.\n//\n// This is the legacy version of KFDef that predates the use of kustomize stacks. In this case\n// application parameters are set by modifying the Applications in the KFDef spec.\nfunc (c *KfConfig) legacySetApplicationParameter(appName string, paramName string, value string) error {\n\t// First we check applications for an application with the specified name.\n\tif c.Spec.Applications != nil {\n\t\tappIndex := -1\n\t\tfor i, a := range c.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\tappIndex = i\n\t\t\t}\n\t\t}\n\n\t\tif appIndex >= 0 {\n\n\t\t\tif c.Spec.Applications[appIndex].KustomizeConfig == nil {\n\t\t\t\treturn errors.WithStack(fmt.Errorf(\"Application %v doesn't have KustomizeConfig\", appName))\n\t\t\t}\n\n\t\t\tc.Spec.Applications[appIndex].KustomizeConfig.Parameters = setParameter(\n\t\t\t\tc.Spec.Applications[appIndex].KustomizeConfig.Parameters, paramName, value)\n\n\t\t\treturn nil\n\t\t}\n\n\t}\n\tlog.Warnf(\"Application %v not found\", appName)\n\treturn nil\n}\n\n// SetApplicationParameter sets the desired application parameter.\nfunc (c *KfConfig) SetApplicationParameter(appName string, paramName string, value string) error {\n\tif c.UsingStacks() {\n\t\t// We need to map the application names to the stack they belong to.\n\t\t// Prior to the v3 version which introduced the stack there was a 1:1 mapping between the appName\n\t\t// and the kustomize directory for that application.\n\t\t// With the introduction of stacks some of the applications e.g. \"jupyter-web-app\" are now in the\n\t\t// the kubeflow-apps stack. So when we call SetApplicationParameter(\"jupyter-web-app\",...)\n\t\t// we actually want to modify the config map inside ${KFAPP}/kustomize/kubeflow-apps\n\t\t//\n\t\t// TODO(jlewi): Is there a better way handle this other than hardcoding the path.\n\t\tappToStack := map[string]string{\n\t\t\t\"centraldashboard\": KfAppsStackName,\n\t\t\t\"cloud-endpoints\":  \"cloud-endpoints\",\n\t\t\t\"default-install\":  KfAppsStackName,\n\t\t\t\"istio-stack\":      \"istio-stack\",\n\t\t\t\"iap-ingress\":      \"iap-ingress\",\n\t\t\t\"jupyter-web-app\":  KfAppsStackName,\n\t\t\t\"metacontroller\":   \"metacontroller\",\n\t\t\t\"profiles\":         KfAppsStackName,\n\t\t\t\"dex\":              \"dex\",\n\t\t\t// Spartakus is its own application because we want kfctl to be able to remove it.\n\t\t\t\"spartakus\": \"spartakus\",\n\t\t\t// AWS Specific\n\t\t\t\"aws-alb-ingress-controller\": KfAppsStackName,\n\t\t\t\"istio-ingress\":              \"istio-ingress\",\n\t\t}\n\n\t\tappNameDir, ok := appToStack[appName]\n\n\t\tif !ok {\n\t\t\t// Default to assuming appNameDir is the same as appName if not explicitly\n\t\t\t// specified?\n\t\t\tappNameDir = appName\n\t\t\tlog.Warnf(\"No stack directory specified for app %v; defaulting to %v\", appName, appNameDir)\n\t\t}\n\t\tkustomizeDir := filepath.Join(c.Spec.AppDir, KustomizeDir, appNameDir)\n\t\treturn setApplicationParameterInConfigMap(kustomizeDir, appName, paramName, value)\n\t}\n\treturn c.legacySetApplicationParameter(appName, paramName, value)\n}\n\n// UsingStacks returns true if the KfDef is using kustomize to collect all of the Kubeflow applications\nfunc (c *KfConfig) UsingStacks() bool {\n\tif c.Spec.Applications == nil {\n\t\treturn false\n\t}\n\n\tfor _, a := range c.Spec.Applications {\n\t\tif a.Name == KfAppsStackName {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc (c *KfConfig) DeleteApplication(appName string) error {\n\t// First we check applications for an application with the specified name.\n\tif c.Spec.Applications != nil {\n\t\tappIndex := -1\n\t\tfor i, a := range c.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\tappIndex = i\n\t\t\t}\n\t\t}\n\n\t\tif appIndex >= 0 {\n\t\t\tc.Spec.Applications = append(c.Spec.Applications[:appIndex], c.Spec.Applications[appIndex+1:]...)\n\t\t\treturn nil\n\t\t}\n\n\t}\n\tlog.Warnf(\"Application %v not found\", appName)\n\treturn nil\n}\n\nfunc (c *KfConfig) AddApplicationOverlay(appName, overlayName string) error {\n\t// First we check applications for an application with the specified name.\n\tif c.Spec.Applications != nil {\n\t\tappIndex := -1\n\t\tfor i, a := range c.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\tappIndex = i\n\t\t\t}\n\t\t}\n\n\t\tif appIndex >= 0 {\n\t\t\toverlayIndex := -1\n\t\t\tfor i, o := range c.Spec.Applications[appIndex].KustomizeConfig.Overlays {\n\t\t\t\tif o == overlayName {\n\t\t\t\t\toverlayIndex = i\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif overlayIndex >= 0 {\n\t\t\t\tlog.Warnf(\"Found existing overlay %v in Application %v, skip adding\", appName, overlayName)\n\t\t\t} else {\n\t\t\t\tc.Spec.Applications[appIndex].KustomizeConfig.Overlays = append(c.Spec.Applications[appIndex].KustomizeConfig.Overlays, overlayName)\n\t\t\t}\n\t\t} else {\n\t\t\tlog.Warnf(\"Application %v not found, overlay %v cannot be added\", appName, overlayName)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *KfConfig) RemoveApplicationOverlay(appName, overlayName string) error {\n\t// First we check applications for an application with the specified name.\n\tif c.Spec.Applications != nil {\n\t\tappIndex := -1\n\t\tfor i, a := range c.Spec.Applications {\n\t\t\tif a.Name == appName {\n\t\t\t\tappIndex = i\n\t\t\t}\n\t\t}\n\n\t\tif appIndex >= 0 {\n\t\t\toverlayIndex := -1\n\t\t\tfor i, o := range c.Spec.Applications[appIndex].KustomizeConfig.Overlays {\n\t\t\t\tif o == overlayName {\n\t\t\t\t\toverlayIndex = i\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif overlayIndex >= 0 {\n\t\t\t\tc.Spec.Applications[appIndex].KustomizeConfig.Overlays = append(c.Spec.Applications[appIndex].KustomizeConfig.Overlays[:overlayIndex],\n\t\t\t\t\tc.Spec.Applications[appIndex].KustomizeConfig.Overlays[overlayIndex+1:]...)\n\t\t\t} else {\n\t\t\t\tlog.Warnf(\"Cannot find overlay %v in Application %v, skip removing\", appName, overlayName)\n\t\t\t}\n\t\t} else {\n\t\t\tlog.Warnf(\"Application %v not found, overlay %v cannot be deleted\", appName, overlayName)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// SetSecret sets the specified secret; if a secret with the given name already exists it is overwritten.\nfunc (c *KfConfig) SetSecret(newSecret Secret) {\n\tfor i, s := range c.Spec.Secrets {\n\t\tif s.Name == newSecret.Name {\n\t\t\tc.Spec.Secrets[i] = newSecret\n\t\t\treturn\n\t\t}\n\t}\n\n\tc.Spec.Secrets = append(c.Spec.Secrets, newSecret)\n}\n\nfunc IsPluginNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\terr, ok := e.(*kfapis.KfError)\n\treturn ok && err.Code == int(kfapis.NOT_FOUND) && strings.HasPrefix(err.Message, pluginNotFoundErrPrefix)\n}\n\nfunc IsConditionNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\terr, ok := e.(*kfapis.KfError)\n\treturn ok && err.Code == int(kfapis.NOT_FOUND) &&\n\t\tstrings.HasPrefix(err.Message, conditionNotFoundErrPrefix)\n}\n\ntype SecretNotFound struct {\n\tName string\n}\n\nfunc (e *SecretNotFound) Error() string {\n\treturn fmt.Sprintf(\"Missing secret %v\", e.Name)\n}\n\nfunc NewSecretNotFound(n string) *SecretNotFound {\n\treturn &SecretNotFound{\n\t\tName: n,\n\t}\n}\n\nfunc IsSecretNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\t_, ok := e.(*SecretNotFound)\n\treturn ok\n}\n\ntype AppNotFound struct {\n\tName string\n}\n\nfunc (e *AppNotFound) Error() string {\n\treturn fmt.Sprintf(\"Application %v is missing\", e.Name)\n}\n\nfunc IsAppNotFound(e error) bool {\n\tif e == nil {\n\t\treturn false\n\t}\n\t_, ok := e.(*AppNotFound)\n\treturn ok\n}\n\nfunc getParameter(parameters []NameValue, paramName string) (string, bool) {\n\tfor _, p := range parameters {\n\t\tif p.Name == paramName {\n\t\t\treturn p.Value, true\n\t\t}\n\t}\n\n\treturn \"\", false\n}\n\nfunc setParameter(parameters []NameValue, paramName string, value string) []NameValue {\n\tpIndex := -1\n\n\tfor i, p := range parameters {\n\t\tif p.Name == paramName {\n\t\t\tpIndex = i\n\t\t}\n\t}\n\n\tif pIndex < 0 {\n\t\tparameters = append(parameters, NameValue{})\n\t\tpIndex = len(parameters) - 1\n\t}\n\n\tparameters[pIndex].Name = paramName\n\tparameters[pIndex].Value = value\n\n\treturn parameters\n}\n"
  },
  {
    "path": "pkg/kfconfig/types_test.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage kfconfig\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/ghodss/yaml\"\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/prometheus/common/log\"\n\t\"io\"\n\t\"io/ioutil\"\n\tv1 \"k8s.io/api/core/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"sigs.k8s.io/kustomize/v3/pkg/types\"\n\t\"testing\"\n)\n\nfunc TestSyncCache(t *testing.T) {\n\ttype testCase struct {\n\t\tinput       *KfConfig\n\t\texpected    []Cache\n\t\texpectedErr error\n\t}\n\n\t// Verify that we can sync some files.\n\ttestDir, _ := ioutil.TempDir(\"\", \"\")\n\n\tsrcDir := path.Join(testDir, \"src\")\n\terr := os.Mkdir(srcDir, os.ModePerm)\n\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create directoy; %v\", err)\n\t}\n\n\tioutil.WriteFile(path.Join(srcDir, \"file1\"), []byte(\"hello world\"), os.ModePerm)\n\n\t// Verify that we can unpack a local tarball and use it.\n\ttarballName := \"c0e81bedec9a4df8acf568cc5ccacc4bc05a3b38.tar.gz\"\n\tfrom, err := os.Open(path.Join(\"./testdata\", tarballName))\n\tif err != nil {\n\t\tt.Fatalf(\"failed to open tarball file: %v\", err)\n\t}\n\ttarballPath := path.Join(srcDir, tarballName)\n\tto, err := os.OpenFile(tarballPath, os.O_RDWR|os.O_CREATE, 0666)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to open new file location fortarball file: %v\", err)\n\t}\n\tif _, err = io.Copy(to, from); err != nil {\n\t\tt.Fatalf(\"tarball copy is failed: %v\", err)\n\t}\n\n\trepoName := \"testRepo\"\n\n\ttestCases := []testCase{\n\t\t{\n\t\t\tinput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tAppDir: path.Join(testDir, \"app1\"),\n\t\t\t\t\tRepos: []Repo{{\n\t\t\t\t\t\tName: repoName,\n\t\t\t\t\t\tURI:  srcDir,\n\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []Cache{\n\t\t\t\t{\n\t\t\t\t\tName:      repoName,\n\t\t\t\t\tLocalPath: path.Join(testDir, \"app1\", \".cache\", repoName),\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedErr: nil,\n\t\t},\n\t\t{\n\t\t\tinput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tAppDir: path.Join(srcDir, \"app1\"),\n\t\t\t\t\tRepos: []Repo{{\n\t\t\t\t\t\tName: repoName,\n\t\t\t\t\t\tURI:  srcDir,\n\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected:    nil,\n\t\t\texpectedErr: errors.New(\"SyncCache: could not sync cache when the cache path \" + path.Join(srcDir, \"app1\", \".cache\", repoName) + \" is sub directory of manifests \" + srcDir),\n\t\t},\n\t\t{\n\t\t\tinput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tAppDir: \".\",\n\t\t\t\t\tRepos: []Repo{{\n\t\t\t\t\t\tName: repoName,\n\t\t\t\t\t\tURI:  srcDir,\n\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []Cache{\n\t\t\t\t{\n\t\t\t\t\tName:      repoName,\n\t\t\t\t\tLocalPath: path.Join(\".cache\", repoName),\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedErr: nil,\n\t\t},\n\t\t{\n\t\t\tinput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tAppDir: path.Join(testDir, \"app2\"),\n\t\t\t\t\tRepos: []Repo{{\n\t\t\t\t\t\tName: repoName,\n\t\t\t\t\t\tURI:  \"file:\" + tarballPath,\n\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: []Cache{\n\t\t\t\t{\n\t\t\t\t\tName:      repoName,\n\t\t\t\t\tLocalPath: path.Join(testDir, \"app2\", \".cache\", repoName, \"kubeflow-manifests-c0e81be\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedErr: nil,\n\t\t},\n\t\t// The following test cases pull from GitHub. The may be worth commenting\n\t\t// out in the unittests and only running manually\n\t\t//{\n\t\t//\tinput: &KfConfig{\n\t\t//\t\tSpec: KfConfigSpec{\n\t\t//\t\t\tAppDir: path.Join(testDir, \"app2\"),\n\t\t//\t\t\tRepos: []Repo{{\n\t\t//\t\t\t\tName: repoName,\n\t\t//\t\t\t\tURI:  \"https://github.com/kubeflow/manifests/archive/master.tar.gz\",\n\t\t//\t\t\t},\n\t\t//\t\t\t},\n\t\t//\t\t},\n\t\t//\t},\n\t\t//\texpected: []Cache {\n\t\t//\t\t{\n\t\t//\t\t\tLocalPath: path.Join(testDir, \"app2\", \".cache\", repoName, \"manifests-master\"),\n\t\t//\t\t},\n\t\t//\t},\n\t\t//},\n\t\t//{\n\t\t//\tinput: &KfConfig{\n\t\t//\t\tSpec: KfConfigSpec{\n\t\t//\t\t\tAppDir: path.Join(testDir, \"app3\"),\n\t\t//\t\t\tRepos: []Repo{{\n\t\t//\t\t\t\tName: repoName,\n\t\t//\t\t\t\tURI:  \"https://github.com/kubeflow/manifests/tarball/pull/187/head?archive=tar.gz\",\n\t\t//\t\t\t},\n\t\t//\t\t\t},\n\t\t//\t\t},\n\t\t//\t},\n\t\t//\texpected: []Cache {\n\t\t//\t\t{\n\t\t//\t\t\tLocalPath: path.Join(testDir, \"app3\", \".cache\", repoName, \"kubeflow-manifests-c04764b\"),\n\t\t//\t\t},\n\t\t//\t},\n\t\t//},\n\t}\n\n\tfor _, c := range testCases {\n\t\terr = c.input.SyncCache()\n\n\t\t// remove the local path for the test case whose AppDir is \".\"\n\t\tif c.input.Spec.AppDir == \".\" {\n\t\t\tos.RemoveAll(path.Join(\".cache\", repoName))\n\t\t}\n\n\t\tif err != nil {\n\t\t\tif c.expectedErr == nil || err.Error() != c.expectedErr.Error() {\n\t\t\t\tt.Fatalf(\"Could not sync cache; %v\", err)\n\t\t\t}\n\t\t}\n\n\t\tif c.expected != nil {\n\t\t\tactual := c.input.Status.Caches[0].LocalPath\n\t\t\texpected := c.expected[0].LocalPath\n\t\t\tif actual != expected {\n\t\t\t\tt.Fatalf(\"LocalPath; got %v; want %v\", actual, expected)\n\t\t\t}\n\t\t}\n\t}\n\n}\n\ntype FakePluginSpec struct {\n\tParam     string `json:\"param,omitempty\"`\n\tBoolParam bool   `json:\"boolParam,omitempty\"`\n}\n\nfunc TestKfConfig_GetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tFilename   string\n\t\tPluginName string\n\t\tPluginKind PluginKindType\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tFilename:   \"kfctl_plugin_test.yaml\",\n\t\t\tPluginName: \"fake\",\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"someparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\twd, _ := os.Getwd()\n\t\tfPath := path.Join(wd, \"testdata\", c.Filename)\n\n\t\tbuf, bufErr := ioutil.ReadFile(fPath)\n\t\tif bufErr != nil {\n\t\t\tt.Fatalf(\"Error reading file %v; error %v\", fPath, bufErr)\n\t\t}\n\n\t\tlog.Infof(\"Want \")\n\t\td := &KfConfig{}\n\t\terr := yaml.Unmarshal(buf, d)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not parse as KfConfig error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginKind, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin spec got;\\n%v\\nwant;\\n%v\", pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_SetPluginSpec(t *testing.T) {\n\t// Test that we can properly parse the gcp structs.\n\ttype testCase struct {\n\t\tPluginName string\n\t\tPluginKind PluginKindType\n\t\tExpected   *FakePluginSpec\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tPluginName: \"fake\",\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"oldparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Override the existing plugin\n\t\t{\n\t\t\tPluginName: \"fake\",\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t\t// Add a new plugin\n\t\t{\n\t\t\tPluginName: \"fake\",\n\t\t\tPluginKind: \"fakeplugin\",\n\t\t\tExpected: &FakePluginSpec{\n\t\t\t\tParam:     \"newparam\",\n\t\t\t\tBoolParam: true,\n\t\t\t},\n\t\t},\n\t}\n\n\td := &KfConfig{}\n\n\tfor _, c := range cases {\n\t\terr := d.SetPluginSpec(c.PluginKind, c.Expected)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not set plugin spec; error %v\", err)\n\t\t}\n\n\t\tactual := &FakePluginSpec{}\n\t\terr = d.GetPluginSpec(c.PluginKind, actual)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not get plugin spec; error %v\", err)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actual, c.Expected) {\n\t\t\tpGot, _ := Pformat(actual)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error parsing plugin, plugin spec doesn't match %v\", cmp.Diff(pGot, pWant))\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_GetSecret(t *testing.T) {\n\td := &KfConfig{\n\t\tSpec: KfConfigSpec{\n\t\t\tAppDir: \"someapp\",\n\t\t\tSecrets: []Secret{\n\t\t\t\t{\n\t\t\t\t\tName: \"s1\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\tValue: \"somedata\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: \"s2\",\n\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\tEnvSource: &EnvSource{\n\t\t\t\t\t\t\tName: \"s2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\ttype testCase struct {\n\t\tSecretName    string\n\t\tExpectedValue string\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tSecretName:    \"s1\",\n\t\t\tExpectedValue: \"somedata\",\n\t\t},\n\t\t{\n\t\t\tSecretName:    \"s2\",\n\t\t\tExpectedValue: \"somesecret\",\n\t\t},\n\t}\n\n\tos.Setenv(\"s2\", \"somesecret\")\n\tfor _, c := range cases {\n\t\tactual, err := d.GetSecret(c.SecretName)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Error getting secret %v; error %v\", c.SecretName, err)\n\t\t}\n\n\t\tif actual != c.ExpectedValue {\n\t\t\tt.Errorf(\"Secret %v value doesn't match %v\", c.SecretName, cmp.Diff(actual, c.ExpectedValue))\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_SetSecret(t *testing.T) {\n\ttype testCase struct {\n\t\tInput    KfConfig\n\t\tSecret   Secret\n\t\tExpected KfConfig\n\t}\n\n\tcases := []testCase{\n\t\t// No Secrets exist\n\t\t{\n\t\t\tInput: KfConfig{},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Override a secret\n\t\t{\n\t\t\tInput: KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"oldvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tSecret: Secret{\n\t\t\t\tName: \"s1\",\n\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpected: KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tSecrets: []Secret{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"s1\",\n\t\t\t\t\t\t\tSecretSource: &SecretSource{\n\t\t\t\t\t\t\t\tLiteralSource: &LiteralSource{\n\t\t\t\t\t\t\t\t\tValue: \"newvalue\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\ti := &KfConfig{}\n\t\t*i = c.Input\n\t\ti.SetSecret(c.Secret)\n\n\t\tif !reflect.DeepEqual(*i, c.Expected) {\n\t\t\tpGot, _ := Pformat(i)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting secret %v; got;\\n%v\\nwant;\\n%v\", c.Secret.Name, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_addPatchStratgicMerge(t *testing.T) {\n\ttype testCase struct {\n\t\tInput     *types.Kustomization\n\t\tPatchName string\n\t\tExpected  *types.Kustomization\n\t}\n\n\tcases := []testCase{\n\t\t// New parameter\n\t\t{\n\t\t\tInput:     &types.Kustomization{},\n\t\t\tPatchName: \"new-config.yaml\",\n\t\t\tExpected: &types.Kustomization{\n\t\t\t\tPatchesStrategicMerge: []types.PatchStrategicMerge{\n\t\t\t\t\ttypes.PatchStrategicMerge(\"new-config.yaml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Existing parameter\n\t\t{\n\t\t\tInput: &types.Kustomization{\n\t\t\t\tPatchesStrategicMerge: []types.PatchStrategicMerge{\n\t\t\t\t\ttypes.PatchStrategicMerge(\"config1.yaml\"),\n\t\t\t\t\ttypes.PatchStrategicMerge(\"exists-config.yaml\"),\n\t\t\t\t\ttypes.PatchStrategicMerge(\"config2.yaml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tPatchName: \"exists-config.yaml\",\n\t\t\tExpected: &types.Kustomization{\n\t\t\t\tPatchesStrategicMerge: []types.PatchStrategicMerge{\n\t\t\t\t\ttypes.PatchStrategicMerge(\"config1.yaml\"),\n\t\t\t\t\ttypes.PatchStrategicMerge(\"exists-config.yaml\"),\n\t\t\t\t\ttypes.PatchStrategicMerge(\"config2.yaml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\taddPatchStratgicMerge(c.Input, c.PatchName)\n\t\tif !reflect.DeepEqual(c.Input, c.Expected) {\n\t\t\tpGot, _ := Pformat(c.Input)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error adding patch %v; got;\\n%v\\nwant;\\n%v\", c.PatchName, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc Test_setApplicationParameterInConfigMap(t *testing.T) {\n\ttype testCase struct {\n\t\tName                  string\n\t\tInputKustomization    *types.Kustomization\n\t\tInputPatch            *v1.ConfigMap\n\t\tAppName               string\n\t\tParameterName         string\n\t\tValue                 string\n\t\tExpectedKustomization *types.Kustomization\n\t\tExpectedPatch         *v1.ConfigMap\n\t}\n\n\tcases := []testCase{\n\t\t// New parameter\n\t\t{\n\t\t\tName:               \"No-patch\",\n\t\t\tInputKustomization: &types.Kustomization{},\n\t\t\tInputPatch:         nil,\n\t\t\tAppName:            \"app\",\n\t\t\tParameterName:      \"param\",\n\t\t\tValue:              \"value\",\n\t\t\tExpectedKustomization: &types.Kustomization{\n\t\t\t\tPatchesStrategicMerge: []types.PatchStrategicMerge{\n\t\t\t\t\ttypes.PatchStrategicMerge(\"app-config.yaml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpectedPatch: &v1.ConfigMap{\n\t\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\tKind:       \"ConfigMap\",\n\t\t\t\t},\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tName: \"app-config\",\n\t\t\t\t},\n\t\t\t\tData: map[string]string{\n\t\t\t\t\t\"param\": \"value\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Modify existing parameter\n\t\t{\n\t\t\tName:               \"existing-parameter\",\n\t\t\tInputKustomization: &types.Kustomization{},\n\t\t\tInputPatch: &v1.ConfigMap{\n\t\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\tKind:       \"ConfigMap\",\n\t\t\t\t},\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tName: \"app-config\",\n\t\t\t\t},\n\t\t\t\tData: map[string]string{\n\t\t\t\t\t\"a\":     \"b\",\n\t\t\t\t\t\"param\": \"oldvalue\",\n\t\t\t\t\t\"d\":     \"e\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:       \"app\",\n\t\t\tParameterName: \"param\",\n\t\t\tValue:         \"newvalue\",\n\t\t\tExpectedKustomization: &types.Kustomization{\n\t\t\t\tPatchesStrategicMerge: []types.PatchStrategicMerge{\n\t\t\t\t\ttypes.PatchStrategicMerge(\"app-config.yaml\"),\n\t\t\t\t},\n\t\t\t},\n\t\t\tExpectedPatch: &v1.ConfigMap{\n\t\t\t\tTypeMeta: metav1.TypeMeta{\n\t\t\t\t\tAPIVersion: \"v1\",\n\t\t\t\t\tKind:       \"ConfigMap\",\n\t\t\t\t},\n\t\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\t\tName: \"app-config\",\n\t\t\t\t},\n\t\t\t\tData: map[string]string{\n\t\t\t\t\t\"a\":     \"b\",\n\t\t\t\t\t\"param\": \"newvalue\",\n\t\t\t\t\t\"d\":     \"e\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\t// Create a kustomization app based on the inputs.\n\t\ttestDir, err := ioutil.TempDir(\"\", \"testSetApplicationParameter-\"+c.Name)\n\n\t\tlog.Infof(\"Test case: %v; directory: %v\", c.Name, testDir)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Could not creat temporary directory: %v\", err)\n\t\t}\n\n\t\ttype pair struct {\n\t\t\to    interface{}\n\t\t\tpath string\n\t\t}\n\n\t\tpairs := []pair{\n\t\t\t{\n\t\t\t\to:    c.InputKustomization,\n\t\t\t\tpath: filepath.Join(testDir, \"kustomization.yaml\"),\n\t\t\t},\n\t\t}\n\n\t\tif c.InputPatch != nil {\n\t\t\tpairs = append(pairs, pair{\n\t\t\t\to:    c.InputPatch,\n\t\t\t\tpath: filepath.Join(testDir, c.AppName+\"-config.yaml\"),\n\t\t\t})\n\t\t}\n\n\t\tfor _, p := range pairs {\n\t\t\tkBytes, err := yaml.Marshal(p.o)\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Could not marshal yaml error: %v\", err)\n\t\t\t}\n\t\t\tif err := ioutil.WriteFile(p.path, kBytes, os.ModePerm); err != nil {\n\t\t\t\tt.Fatalf(\"Could not write file: %v; error %v\", p.path, err)\n\t\t\t}\n\t\t}\n\t\tsetApplicationParameterInConfigMap(testDir, c.AppName, c.ParameterName, c.Value)\n\n\t\tparse := func(path string, o interface{}) {\n\t\t\tb, err := ioutil.ReadFile(path)\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Could not read file: %v; error %v\", path, err)\n\t\t\t}\n\n\t\t\tif err := yaml.Unmarshal(b, o); err != nil {\n\t\t\t\tt.Fatalf(\"Could not read unmarshal yaml; error: %v\", err)\n\t\t\t}\n\t\t}\n\n\t\tactualKustomization := &types.Kustomization{}\n\t\tactualPatch := &v1.ConfigMap{}\n\n\t\tparse(filepath.Join(testDir, \"kustomization.yaml\"), actualKustomization)\n\t\tparse(filepath.Join(testDir, c.AppName+\"-config.yaml\"), actualPatch)\n\n\t\tif !reflect.DeepEqual(actualKustomization, c.ExpectedKustomization) {\n\t\t\tpGot, _ := Pformat(actualKustomization)\n\t\t\tpWant, _ := Pformat(c.ExpectedKustomization)\n\t\t\tt.Errorf(\"Case %v: kustomization.yaml: got;\\n%v\\nwant;\\n%v\", c.Name, pGot, pWant)\n\t\t}\n\n\t\tif !reflect.DeepEqual(actualPatch, c.ExpectedPatch) {\n\t\t\tpGot, _ := Pformat(actualPatch)\n\t\t\tpWant, _ := Pformat(c.ExpectedPatch)\n\t\t\tt.Errorf(\"Case %v: kustomization.yaml: got;\\n%v\\nwant;\\n%v\", c.Name, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_SetApplicationParameter(t *testing.T) {\n\ttype testCase struct {\n\t\tInput     *KfConfig\n\t\tAppName   string\n\t\tParamName string\n\t\tValue     string\n\t\tExpected  *KfConfig\n\t}\n\n\tcases := []testCase{\n\t\t// New parameter\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName:            \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tValue:     \"v1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Override parameter\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tValue:     \"v1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"v1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tc.Input.SetApplicationParameter(c.AppName, c.ParamName, c.Value)\n\t\tif !reflect.DeepEqual(c.Input, c.Expected) {\n\t\t\tpGot, _ := Pformat(c.Input)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting App %v; Param %v; value %v; got;\\n%v\\nwant;\\n%v\", c.AppName, c.ParamName, c.Value, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_GetApplicationParameter(t *testing.T) {\n\ttype testCase struct {\n\t\tInput     *KfConfig\n\t\tAppName   string\n\t\tParamName string\n\t\tExpected  string\n\t\tHasParam  bool\n\t}\n\n\tcases := []testCase{\n\t\t// No parameter\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName:            \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app1\",\n\t\t\tParamName: \"p1\",\n\t\t\tExpected:  \"\",\n\t\t\tHasParam:  false,\n\t\t},\n\t\t// Has Parameter\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:   \"app2\",\n\t\t\tParamName: \"p1\",\n\t\t\tExpected:  \"old1\",\n\t\t\tHasParam:  true,\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tv, hasParam := c.Input.GetApplicationParameter(c.AppName, c.ParamName)\n\n\t\tif c.HasParam != hasParam {\n\t\t\tt.Errorf(\"Error getting App %v; Param %v; hasParam; got; %v; want %v\", c.AppName, c.ParamName, hasParam, c.HasParam)\n\t\t}\n\n\t\tif c.Expected != v {\n\t\t\tt.Errorf(\"Error getting App %v; Param %v; got; %v; want %v\", c.AppName, c.ParamName, c, c.Expected)\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_DeleteApplication(t *testing.T) {\n\ttype testCase struct {\n\t\tInput           *KfConfig\n\t\tAppNameToDelete string\n\t\tExpected        *KfConfig\n\t}\n\n\tcases := []testCase{\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName:            \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName:            \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppNameToDelete: \"app1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName:            \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppNameToDelete: \"app1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tc.Input.DeleteApplication(c.AppNameToDelete)\n\t\tif !reflect.DeepEqual(c.Input, c.Expected) {\n\t\t\tpGot, _ := Pformat(c.Input)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting App %v; got;\\n%v\\nwant;\\n%v\", c.AppNameToDelete, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_AddApplicationOverlay(t *testing.T) {\n\ttype testCase struct {\n\t\tInput        *KfConfig\n\t\tAppName      string\n\t\tOverlayToAdd string\n\t\tExpected     *KfConfig\n\t}\n\n\tcases := []testCase{\n\t\t// overlay already exist\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:      \"app1\",\n\t\t\tOverlayToAdd: \"overlay1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// app not found\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:      \"app2\",\n\t\t\tOverlayToAdd: \"overlay1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// normal\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:      \"app1\",\n\t\t\tOverlayToAdd: \"overlay2\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tc.Input.AddApplicationOverlay(c.AppName, c.OverlayToAdd)\n\t\tif !reflect.DeepEqual(c.Input, c.Expected) {\n\t\t\tpGot, _ := Pformat(c.Input)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting App %v; got;\\n%v\\nwant;\\n%v\", c.OverlayToAdd, pGot, pWant)\n\t\t}\n\t}\n}\n\nfunc TestKfConfig_RemoveApplicationOverlay(t *testing.T) {\n\ttype testCase struct {\n\t\tInput           *KfConfig\n\t\tAppName         string\n\t\tOverlayToRemove string\n\t\tExpected        *KfConfig\n\t}\n\n\tcases := []testCase{\n\t\t// Normal case - remove overlay on boarder\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:         \"app1\",\n\t\t\tOverlayToRemove: \"overlay1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Normal case - remove overlay in the middle\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:         \"app1\",\n\t\t\tOverlayToRemove: \"overlay2\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Can not find app -> remain same\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:         \"app2\",\n\t\t\tOverlayToRemove: \"overlay2\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Can not find overlay -> remain same\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:         \"app1\",\n\t\t\tOverlayToRemove: \"overlay4\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{\n\t\t\t\t\t\t\t\t\t\"overlay1\",\n\t\t\t\t\t\t\t\t\t\"overlay2\",\n\t\t\t\t\t\t\t\t\t\"overlay3\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// no overlay -> remain same\n\t\t{\n\t\t\tInput: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tAppName:         \"app1\",\n\t\t\tOverlayToRemove: \"overlay1\",\n\t\t\tExpected: &KfConfig{\n\t\t\t\tSpec: KfConfigSpec{\n\t\t\t\t\tApplications: []Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &KustomizeConfig{\n\t\t\t\t\t\t\t\tOverlays: []string{},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range cases {\n\t\tc.Input.RemoveApplicationOverlay(c.AppName, c.OverlayToRemove)\n\t\tif !reflect.DeepEqual(c.Input, c.Expected) {\n\t\t\tpGot, _ := Pformat(c.Input)\n\t\t\tpWant, _ := Pformat(c.Expected)\n\t\t\tt.Errorf(\"Error setting App %v; overlay %v; got;\\n%v\\nwant;\\n%v\", c.AppName, c.OverlayToRemove, pGot, pWant)\n\t\t}\n\t}\n}\n\n// Pformat returns a pretty format output of any value.\nfunc Pformat(value interface{}) (string, error) {\n\tif s, ok := value.(string); ok {\n\t\treturn s, nil\n\t}\n\tvalueJson, err := json.MarshalIndent(value, \"\", \"  \")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(valueJson), nil\n}\n"
  },
  {
    "path": "pkg/kfconfig/zz_generated.deepcopy.go",
    "content": "// +build !ignore_autogenerated\n\n/*\nCopyright The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by deepcopy-gen. DO NOT EDIT.\n\npackage kfconfig\n\nimport (\n\truntime \"k8s.io/apimachinery/pkg/runtime\"\n)\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *AppNotFound) DeepCopyInto(out *AppNotFound) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AppNotFound.\nfunc (in *AppNotFound) DeepCopy() *AppNotFound {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(AppNotFound)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Application) DeepCopyInto(out *Application) {\n\t*out = *in\n\tif in.KustomizeConfig != nil {\n\t\tin, out := &in.KustomizeConfig, &out.KustomizeConfig\n\t\t*out = new(KustomizeConfig)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Application.\nfunc (in *Application) DeepCopy() *Application {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Application)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Cache) DeepCopyInto(out *Cache) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Cache.\nfunc (in *Cache) DeepCopy() *Cache {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Cache)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Condition) DeepCopyInto(out *Condition) {\n\t*out = *in\n\tin.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)\n\tin.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition.\nfunc (in *Condition) DeepCopy() *Condition {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Condition)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *EnvSource) DeepCopyInto(out *EnvSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvSource.\nfunc (in *EnvSource) DeepCopy() *EnvSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(EnvSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *HashedSource) DeepCopyInto(out *HashedSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HashedSource.\nfunc (in *HashedSource) DeepCopy() *HashedSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(HashedSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfConfig) DeepCopyInto(out *KfConfig) {\n\t*out = *in\n\tout.TypeMeta = in.TypeMeta\n\tin.ObjectMeta.DeepCopyInto(&out.ObjectMeta)\n\tin.Spec.DeepCopyInto(&out.Spec)\n\tin.Status.DeepCopyInto(&out.Status)\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfConfig.\nfunc (in *KfConfig) DeepCopy() *KfConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.\nfunc (in *KfConfig) DeepCopyObject() runtime.Object {\n\tif c := in.DeepCopy(); c != nil {\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KfConfigSpec) DeepCopyInto(out *KfConfigSpec) {\n\t*out = *in\n\tif in.Applications != nil {\n\t\tin, out := &in.Applications, &out.Applications\n\t\t*out = make([]Application, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Plugins != nil {\n\t\tin, out := &in.Plugins, &out.Plugins\n\t\t*out = make([]Plugin, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Secrets != nil {\n\t\tin, out := &in.Secrets, &out.Secrets\n\t\t*out = make([]Secret, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Repos != nil {\n\t\tin, out := &in.Repos, &out.Repos\n\t\t*out = make([]Repo, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KfConfigSpec.\nfunc (in *KfConfigSpec) DeepCopy() *KfConfigSpec {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KfConfigSpec)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *KustomizeConfig) DeepCopyInto(out *KustomizeConfig) {\n\t*out = *in\n\tif in.RepoRef != nil {\n\t\tin, out := &in.RepoRef, &out.RepoRef\n\t\t*out = new(RepoRef)\n\t\t**out = **in\n\t}\n\tif in.Overlays != nil {\n\t\tin, out := &in.Overlays, &out.Overlays\n\t\t*out = make([]string, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\tif in.Parameters != nil {\n\t\tin, out := &in.Parameters, &out.Parameters\n\t\t*out = make([]NameValue, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KustomizeConfig.\nfunc (in *KustomizeConfig) DeepCopy() *KustomizeConfig {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(KustomizeConfig)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *LiteralSource) DeepCopyInto(out *LiteralSource) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LiteralSource.\nfunc (in *LiteralSource) DeepCopy() *LiteralSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(LiteralSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *NameValue) DeepCopyInto(out *NameValue) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NameValue.\nfunc (in *NameValue) DeepCopy() *NameValue {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(NameValue)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Plugin) DeepCopyInto(out *Plugin) {\n\t*out = *in\n\tif in.Spec != nil {\n\t\tin, out := &in.Spec, &out.Spec\n\t\t*out = new(runtime.RawExtension)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Plugin.\nfunc (in *Plugin) DeepCopy() *Plugin {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Plugin)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Repo) DeepCopyInto(out *Repo) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Repo.\nfunc (in *Repo) DeepCopy() *Repo {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Repo)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *RepoRef) DeepCopyInto(out *RepoRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepoRef.\nfunc (in *RepoRef) DeepCopy() *RepoRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(RepoRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Secret) DeepCopyInto(out *Secret) {\n\t*out = *in\n\tif in.SecretSource != nil {\n\t\tin, out := &in.SecretSource, &out.SecretSource\n\t\t*out = new(SecretSource)\n\t\t(*in).DeepCopyInto(*out)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Secret.\nfunc (in *Secret) DeepCopy() *Secret {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Secret)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretNotFound) DeepCopyInto(out *SecretNotFound) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNotFound.\nfunc (in *SecretNotFound) DeepCopy() *SecretNotFound {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretNotFound)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretRef) DeepCopyInto(out *SecretRef) {\n\t*out = *in\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretRef.\nfunc (in *SecretRef) DeepCopy() *SecretRef {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretRef)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *SecretSource) DeepCopyInto(out *SecretSource) {\n\t*out = *in\n\tif in.LiteralSource != nil {\n\t\tin, out := &in.LiteralSource, &out.LiteralSource\n\t\t*out = new(LiteralSource)\n\t\t**out = **in\n\t}\n\tif in.HashedSource != nil {\n\t\tin, out := &in.HashedSource, &out.HashedSource\n\t\t*out = new(HashedSource)\n\t\t**out = **in\n\t}\n\tif in.EnvSource != nil {\n\t\tin, out := &in.EnvSource, &out.EnvSource\n\t\t*out = new(EnvSource)\n\t\t**out = **in\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretSource.\nfunc (in *SecretSource) DeepCopy() *SecretSource {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(SecretSource)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n\n// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\nfunc (in *Status) DeepCopyInto(out *Status) {\n\t*out = *in\n\tif in.Conditions != nil {\n\t\tin, out := &in.Conditions, &out.Conditions\n\t\t*out = make([]Condition, len(*in))\n\t\tfor i := range *in {\n\t\t\t(*in)[i].DeepCopyInto(&(*out)[i])\n\t\t}\n\t}\n\tif in.Caches != nil {\n\t\tin, out := &in.Caches, &out.Caches\n\t\t*out = make([]Cache, len(*in))\n\t\tcopy(*out, *in)\n\t}\n\treturn\n}\n\n// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Status.\nfunc (in *Status) DeepCopy() *Status {\n\tif in == nil {\n\t\treturn nil\n\t}\n\tout := new(Status)\n\tin.DeepCopyInto(out)\n\treturn out\n}\n"
  },
  {
    "path": "pkg/kfupgrade/kfupgrade.go",
    "content": "// 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// Package kfupgrade\npackage kfupgrade\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/base32\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"k8s.io/client-go/kubernetes/scheme\"\n\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypesv3 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\tkfupgrade \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/kfupgrade/v1alpha1\"\n\tkfdefgcpplugin \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/plugins/gcp/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/coordinator\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\tkfconfigloaders \"github.com/kubeflow/kfctl/v3/pkg/kfconfig/loaders\"\n\tapplicationsv1beta1 \"github.com/kubernetes-sigs/application/pkg/apis/app/v1beta1\"\n\tlog \"github.com/sirupsen/logrus\"\n\tappsv1 \"k8s.io/api/apps/v1\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/runtime\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n)\n\ntype KfUpgrader struct {\n\tOldKfCfg   *kfconfig.KfConfig\n\tNewKfCfg   *kfconfig.KfConfig\n\tTargetPath string\n}\n\n// Given a path to a base config and the existing KfCfg, create and return a new KfCfg\n// while keeping the existing KfApp's customizations. Also create a new KfApp in the\n// current working directory.\nfunc createNewKfApp(baseConfig string, version string, oldKfCfg *kfconfig.KfConfig) (*kfconfig.KfConfig, string, error) {\n\tappDir, err := os.Getwd()\n\tif err != nil {\n\t\treturn nil, \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not get current directory %v\", err),\n\t\t}\n\t}\n\n\t// Load the new KfCfg from the base config\n\tnewKfCfg, err := kfconfigloaders.LoadConfigFromURI(baseConfig)\n\tif err != nil {\n\t\treturn nil, \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Could not load %v. Error: %v\", baseConfig, err),\n\t\t}\n\t}\n\n\t// Merge the previous KfCfg's customized values into the new KfCfg\n\tMergeKfCfg(oldKfCfg, newKfCfg)\n\n\t// Compute hash from the new KfCfg and use it to create the new app directory\n\th, err := computeHash(newKfCfg)\n\tif err != nil {\n\t\treturn nil, \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Could not compute sha256 hash. Error: %v\", err),\n\t\t}\n\t}\n\n\tnewAppDir := filepath.Join(appDir, h)\n\tnewKfCfg.Spec.AppDir = newAppDir\n\tnewKfCfg.Spec.Version = version\n\toutputFilePath := filepath.Join(newAppDir, newKfCfg.Spec.ConfigFileName)\n\n\t// Make sure the directory is created.\n\tif _, err := os.Stat(newAppDir); os.IsNotExist(err) {\n\t\tlog.Infof(\"Creating directory %v\", newAppDir)\n\t\terr = os.MkdirAll(newAppDir, os.ModePerm)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Couldn't create directory %v: %v\", newAppDir, err)\n\t\t\treturn nil, \"\", err\n\t\t}\n\t} else {\n\t\tlog.Infof(\"App directory %v already exists\", newAppDir)\n\t}\n\n\terr = kfconfigloaders.WriteConfigToFile(*newKfCfg)\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\n\treturn newKfCfg, outputFilePath, nil\n}\n\n// Given a KfUpgrade config, either find the KfApp that matches the NewKfCfg reference or\n// create a new one.\nfunc NewKfUpgrade(upgradeConfig string) (*KfUpgrader, error) {\n\t// Parse the KfUpgrade spec.\n\tupgrade, err := kfupgrade.LoadKfUpgradeFromUri(upgradeConfig)\n\tif err != nil {\n\t\tlog.Errorf(\"Could not load %v; error %v\", upgradeConfig, err)\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n\n\t// Try to find the old KfCfg.\n\toldKfCfg, _, err := findKfCfg(upgrade.Spec.CurrentKfDef)\n\tif err != nil || oldKfCfg == nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Could not find existing KfCfg %v. Error: %v\", upgrade.Spec.CurrentKfDef.Name, err),\n\t\t}\n\t}\n\n\t// Try to find the new KfCfg.\n\tnewKfCfg, targetPath, err := findKfCfg(upgrade.Spec.NewKfDef)\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Encountered error while trying to find %v: %v\", upgrade.Spec.NewKfDef.Name, err),\n\t\t}\n\t}\n\n\t// If the new KfCfg is not found, create it\n\tif newKfCfg == nil {\n\t\tnewKfCfg, targetPath, err = createNewKfApp(upgrade.Spec.BaseConfigPath, upgrade.Spec.NewKfDef.Version, oldKfCfg)\n\t\tif err != nil {\n\t\t\treturn nil, &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\tMessage: fmt.Sprintf(\"Encountered error while creating new KfApp %v: %v\", upgrade.Spec.NewKfDef.Name, err),\n\t\t\t}\n\t\t}\n\t}\n\n\treturn &KfUpgrader{\n\t\tOldKfCfg:   oldKfCfg,\n\t\tNewKfCfg:   newKfCfg,\n\t\tTargetPath: targetPath,\n\t}, nil\n}\n\nfunc computeHash(d *kfconfig.KfConfig) (string, error) {\n\th := sha256.New()\n\tbuf := new(bytes.Buffer)\n\tjson.NewEncoder(buf).Encode(d)\n\th.Write([]byte(buf.Bytes()))\n\tid := base32.HexEncoding.WithPadding(base32.NoPadding).EncodeToString(h.Sum(nil))\n\tid = strings.ToLower(id)[0:7]\n\n\treturn id, nil\n}\n\nfunc findKfCfg(kfDefRef *kfupgrade.KfDefRef) (*kfconfig.KfConfig, string, error) {\n\tvar target *kfconfig.KfConfig\n\tvar targetPath string\n\terr := filepath.Walk(\".\",\n\t\tfunc(path string, info os.FileInfo, err error) error {\n\t\t\tif target != nil {\n\t\t\t\t// If we already found the target directory, skip\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif strings.Contains(path, \".cache\") {\n\t\t\t\t// Skip cache directories\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif !strings.HasSuffix(path, \"yaml\") {\n\t\t\t\t// Skip everything that's not a yaml file\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tkfCfg, err := kfconfigloaders.LoadConfigFromURI(path)\n\t\t\tif err != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif kfCfg.Name == kfDefRef.Name && kfCfg.Spec.Version == kfDefRef.Version {\n\t\t\t\tlog.Infof(\"Found KfCfg with matching name: %v version: %v at %v\", kfCfg.Name, kfCfg.Spec.Version, path)\n\t\t\t\ttarget = kfCfg\n\t\t\t\ttargetPath = path\n\t\t\t}\n\n\t\t\treturn err\n\t\t})\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn nil, \"\", err\n\t}\n\n\twd, err := os.Getwd()\n\tif err != nil {\n\t\treturn nil, \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not get current directory %v\", err),\n\t\t}\n\t}\n\n\treturn target, filepath.Join(wd, targetPath), err\n}\n\nfunc MergeKfCfg(oldKfCfg *kfconfig.KfConfig, newKfCfg *kfconfig.KfConfig) {\n\tnewKfCfg.Name = oldKfCfg.Name\n\n\t// Merge plugins.\n\tpluginKinds := []kfconfig.PluginKindType{\n\t\tkfconfig.AWS_PLUGIN_KIND,\n\t\tkfconfig.GCP_PLUGIN_KIND,\n\t\tkfconfig.MINIKUBE_PLUGIN_KIND,\n\t\tkfconfig.EXISTING_ARRIKTO_PLUGIN_KIND,\n\t}\n\n\tfor _, kind := range pluginKinds {\n\t\toldPlugin := kfdefgcpplugin.GcpPluginSpec{}\n\t\terr := oldKfCfg.GetPluginSpec(kind, &oldPlugin)\n\n\t\t// If no error, then this plugin is found and we need to copy it to the new KfCfg.\n\t\tif err == nil {\n\t\t\tlog.Infof(\"Merging plugin spec: %v\\n\", kind)\n\t\t\tnewKfCfg.SetPluginSpec(kind, &oldPlugin)\n\t\t}\n\t}\n\n\tfor appIndex, newApp := range newKfCfg.Spec.Applications {\n\t\tfor _, oldApp := range oldKfCfg.Spec.Applications {\n\t\t\tif newApp.Name == oldApp.Name {\n\t\t\t\tfor paramIndex, newParam := range newApp.KustomizeConfig.Parameters {\n\t\t\t\t\tfor _, oldParam := range oldApp.KustomizeConfig.Parameters {\n\t\t\t\t\t\tif newParam.Name == oldParam.Name && newParam.Value != oldParam.Value {\n\t\t\t\t\t\t\tlog.Infof(\"Merging application %v param %v from %v to %v\\n\",\n\t\t\t\t\t\t\t\tnewApp.Name, newParam.Name, newParam.Value, oldParam.Value)\n\t\t\t\t\t\t\tnewKfCfg.Spec.Applications[appIndex].KustomizeConfig.Parameters[paramIndex].Value = oldParam.Value\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (upgrader *KfUpgrader) Generate() error {\n\tkfApp, err := coordinator.NewLoadKfAppFromURI(upgrader.TargetPath)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to build KfApp from URI: %v\", err)\n\t\treturn err\n\t}\n\n\treturn kfApp.Generate(kftypesv3.K8S)\n}\n\nfunc (upgrader *KfUpgrader) Apply() error {\n\tkfApp, err := coordinator.NewLoadKfAppFromURI(upgrader.TargetPath)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to build KfApp from URI: %v\", err)\n\t\treturn err\n\t}\n\n\terr = kfApp.Generate(kftypesv3.K8S)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to generate KfApp: %v\", err)\n\t\treturn err\n\t}\n\n\terr = upgrader.DeleteObsoleteResources(upgrader.OldKfCfg.ObjectMeta.Namespace)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to delete obsolete resources: %v\", err)\n\t\treturn err\n\t}\n\n\terr = upgrader.DeleteObsoleteResources(\"istio-system\")\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to delete obsolete resources: %v\", err)\n\t\treturn err\n\t}\n\n\treturn kfApp.Apply(kftypesv3.K8S)\n}\n\nfunc (upgrader *KfUpgrader) Dump() error {\n\tkfApp, err := coordinator.NewLoadKfAppFromURI(upgrader.TargetPath)\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to build KfApp from URI: %v\", err)\n\t\treturn err\n\t}\n\n\treturn kfApp.Dump(kftypesv3.K8S)\n}\n\nfunc (upgrader *KfUpgrader) DeleteObsoleteResources(ns string) error {\n\tapplicationsv1beta1.AddToScheme(scheme.Scheme)\n\n\tlog.Infof(\"Deleting resources in in namespace %v\", ns)\n\n\tobjs := []runtime.Object{\n\t\t&applicationsv1beta1.Application{},\n\t\t&appsv1.Deployment{},\n\t\t&appsv1.StatefulSet{},\n\t\t&appsv1.ReplicaSet{},\n\t\t&appsv1.DaemonSet{},\n\t}\n\n\tfor _, obj := range objs {\n\t\terr := upgrader.DeleteResources(ns, obj)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (upgrader *KfUpgrader) DeleteResources(ns string, obj runtime.Object) error {\n\tconfig := kftypesv3.GetConfig()\n\tkubeClient, err := client.New(config, client.Options{})\n\tobjKind := reflect.TypeOf(obj)\n\n\tlog.Infof(\"Deleting resources type %v in in namespace %v\", objKind, ns)\n\terr = kubeClient.DeleteAllOf(context.Background(),\n\t\tobj,\n\t\tclient.InNamespace(ns),\n\t\tclient.MatchingLabels{\n\t\t\t\"app.kubernetes.io/part-of\": \"kubeflow\",\n\t\t},\n\t\tclient.PropagationPolicy(metav1.DeletePropagationBackground))\n\n\tif err != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"couldn't delete %v Error: %v\", objKind, err),\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/kfupgrade/kfupgrade_test.go",
    "content": "package kfupgrade\n\nimport (\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfconfig\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"reflect\"\n\t\"testing\"\n)\n\nfunc Test_MergeKfCfg(t *testing.T) {\n\ttype testCase struct {\n\t\toldKf    *kfconfig.KfConfig\n\t\tnewKf    *kfconfig.KfConfig\n\t\texpected *kfconfig.KfConfig\n\t}\n\n\ttestCases := []testCase{\n\t\t// Param names are different; no merging.\n\t\t{\n\t\t\toldKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tnewKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// App names are different, no merging\n\t\t{\n\t\t\toldKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tnewKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app3\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"new1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app3\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"new1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Merging old param values to new\n\t\t{\n\t\t\toldKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tnewKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"new1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"new2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t// Merging two apps\n\t\t{\n\t\t\toldKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tnewKf: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"new1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"new2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: &kfconfig.KfConfig{\n\t\t\t\tSpec: kfconfig.KfConfigSpec{\n\t\t\t\t\tApplications: []kfconfig.Application{\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app1\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p1\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old1\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tName: \"app2\",\n\t\t\t\t\t\t\tKustomizeConfig: &kfconfig.KustomizeConfig{\n\t\t\t\t\t\t\t\tParameters: []kfconfig.NameValue{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tName:  \"p2\",\n\t\t\t\t\t\t\t\t\t\tValue: \"old2\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, c := range testCases {\n\t\tMergeKfCfg(c.oldKf, c.newKf)\n\t\tif !reflect.DeepEqual(c.newKf, c.expected) {\n\t\t\tt.Errorf(\"MergeKfCfg produced incorrect results; got\\n%v\\nwant:\\n%v\", utils.PrettyPrint(c.newKf), utils.PrettyPrint(c.expected))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/mirror/mirror_image.go",
    "content": "package mirror\n\nimport (\n\t\"fmt\"\n\t\"github.com/ghodss/yaml\"\n\tmirrorv1alpha1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/imagemirror/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/kfapp/kustomize\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\tpipeline \"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1\"\n\tcloudbuild \"google.golang.org/api/cloudbuild/v1\"\n\t\"io/ioutil\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n)\n\nconst INPUT_IMAGE = \"inputImage\"\nconst OUTPUT_IMAGE = \"outputImage\"\nconst CONTEXT = \"context\"\nconst TASK_NAME = \"mirror-image\"\nconst KUSTOMIZE_FOLDER = \"kustomize\"\nconst CLOUD_BUILD_IMAGE = \"gcr.io/cloud-builders/docker\"\nconst CLOUD_BUILD_FILE = \"cloudbuild.yaml\"\n\ntype ReplicateTasks map[string]string\n\n// buildContext: gs://<GCS bucket>/<path to .tar.gz>\nfunc GenerateMirroringPipeline(directory string, spec mirrorv1alpha1.ReplicationSpec, outputFileName string, gcb bool) error {\n\treplicateTasks := make(ReplicateTasks)\n\n\tfor _, pattern := range spec.Patterns {\n\t\tif err := replicateTasks.fillTasks(directory, pattern.Dest, spec.Context, pattern.Src.Include, pattern.Src.Exclude); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tpipelineTasks := []pipeline.PipelineTask{}\n\tidx := 0\n\tre := regexp.MustCompile(\"[^a-z0-9]+\")\n\tfor _, newImg := range replicateTasks.orderedKeys() {\n\t\toldImg := replicateTasks[newImg]\n\t\tpipelineTasks = append(pipelineTasks, pipeline.PipelineTask{\n\t\t\tName: fmt.Sprintf(\"%v-%v\", idx, re.ReplaceAllString(oldImg, \"-\")),\n\t\t\tTaskRef: &pipeline.TaskRef{\n\t\t\t\tName: TASK_NAME,\n\t\t\t},\n\t\t\tParams: []pipeline.Param{\n\t\t\t\t{\n\t\t\t\t\tName: INPUT_IMAGE,\n\t\t\t\t\tValue: pipeline.ArrayOrString{\n\t\t\t\t\t\tType:      pipeline.ParamTypeString,\n\t\t\t\t\t\tStringVal: oldImg,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: OUTPUT_IMAGE,\n\t\t\t\t\tValue: pipeline.ArrayOrString{\n\t\t\t\t\t\tType:      pipeline.ParamTypeString,\n\t\t\t\t\t\tStringVal: newImg,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tName: CONTEXT,\n\t\t\t\t\tValue: pipeline.ArrayOrString{\n\t\t\t\t\t\tType:      pipeline.ParamTypeString,\n\t\t\t\t\t\tStringVal: \"$(params.context)\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tidx++\n\t}\n\tpipelineIns := pipeline.PipelineRun{\n\t\tTypeMeta: v1.TypeMeta{\n\t\t\tAPIVersion: \"tekton.dev/v1alpha1\",\n\t\t\tKind:       \"PipelineRun\",\n\t\t},\n\t\tObjectMeta: v1.ObjectMeta{\n\t\t\tName: \"replication-pipeline\",\n\t\t},\n\t\tSpec: pipeline.PipelineRunSpec{\n\t\t\tPipelineSpec: &pipeline.PipelineSpec{\n\t\t\t\tTasks: pipelineTasks,\n\t\t\t\tParams: []pipeline.ParamSpec{\n\t\t\t\t\t{\n\t\t\t\t\t\tName: CONTEXT,\n\t\t\t\t\t\tType: pipeline.ParamTypeString,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tParams: []pipeline.Param{\n\t\t\t\t{\n\t\t\t\t\tName: CONTEXT,\n\t\t\t\t\tValue: pipeline.ArrayOrString{\n\t\t\t\t\t\tType:      pipeline.ParamTypeString,\n\t\t\t\t\t\tStringVal: spec.Context,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tbuf, err := yaml.Marshal(pipelineIns)\n\tif err != nil {\n\t\treturn err\n\t}\n\twriteErr := ioutil.WriteFile(outputFileName, buf, 0644)\n\tif writeErr != nil {\n\t\treturn errors.WithStack(writeErr)\n\t}\n\tif gcb {\n\t\treturn generateCloudBuild(replicateTasks)\n\t}\n\treturn nil\n}\n\nfunc generateCloudBuild(rt ReplicateTasks) error {\n\tsteps := []*cloudbuild.BuildStep{}\n\timages := []string{}\n\tfor _, newImg := range rt.orderedKeys() {\n\t\toldImg := rt[newImg]\n\t\tlog.Infof(\"Add gcb step\" + oldImg)\n\t\tsteps = append(steps,\n\t\t\t&cloudbuild.BuildStep{\n\t\t\t\tName:    CLOUD_BUILD_IMAGE,\n\t\t\t\tArgs:    []string{\"build\", \"-t\", newImg, \"--build-arg=INPUT_IMAGE=\" + oldImg, \".\"},\n\t\t\t\tWaitFor: []string{\"-\"},\n\t\t\t},\n\t\t)\n\t\timages = append(images, newImg)\n\t}\n\tcb := cloudbuild.Build{\n\t\tSteps:  steps,\n\t\tImages: images,\n\t}\n\tbuf, err := yaml.Marshal(cb)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ioutil.WriteFile(CLOUD_BUILD_FILE, buf, 0644)\n}\n\nfunc (rt *ReplicateTasks) orderedKeys() []string {\n\tvar keys []string\n\tfor k := range *rt {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Strings(keys)\n\treturn keys\n}\n\n// processKustomizeDir processes the specified kustomize directory\nfunc (rt *ReplicateTasks) processKustomizeDir(absPath string, registry string, include string, exclude string) error {\n\tlog.Infof(\"Processing %v\", absPath)\n\tkustomizationFilePath := filepath.Join(absPath, \"kustomization.yaml\")\n\tif _, err := os.Stat(kustomizationFilePath); err != nil {\n\t\tlog.Infof(\"Skipping %v; no kustomization.yaml found\", absPath)\n\t\treturn nil\n\t}\n\tkustomization := kustomize.GetKustomization(absPath)\n\tfor _, image := range kustomization.Images {\n\t\tcurName := image.Name\n\t\tif image.NewName != \"\" {\n\t\t\tcurName = image.NewName\n\t\t}\n\t\tif strings.Contains(curName, \"$\") {\n\t\t\tlog.Infof(\"Image name %v contains kutomize parameter, skipping\\n\", curName)\n\t\t\tcontinue\n\t\t}\n\t\t// check exclude first\n\t\tif exclude != \"\" && strings.HasPrefix(curName, exclude) {\n\t\t\tlog.Infof(\"Image %v matches exclude prefix %v, skipping\\n\", curName, exclude)\n\t\t\tcontinue\n\t\t}\n\t\t// then check include\n\t\tif include != \"\" && (!strings.HasPrefix(curName, include)) {\n\t\t\tlog.Infof(\"Image %v doesn't match include prefix %v, skipping\\n\", curName, include)\n\t\t\tcontinue\n\t\t}\n\t\tnewName := strings.Join([]string{registry, image.Name}, \"/\")\n\n\t\tif (image.NewTag == \"\") == (image.Digest == \"\") {\n\t\t\tlog.Warnf(\"One and only one of NewTag or Digest can exist for image %s, skipping\\n\",\n\t\t\t\timage.Name)\n\t\t\tcontinue\n\t\t}\n\n\t\tif image.NewTag != \"\" {\n\t\t\t(*rt)[strings.Join([]string{newName, image.NewTag}, \":\")] =\n\t\t\t\tstrings.Join([]string{curName, image.NewTag}, \":\")\n\t\t}\n\t\tif image.Digest != \"\" {\n\t\t\t(*rt)[strings.Join([]string{newName, image.Digest}, \"@\")] =\n\t\t\t\tstrings.Join([]string{curName, image.Digest}, \"@\")\n\t\t}\n\t\tlog.Infof(\"Replacing image name from %s to %s\", image.Name, newName)\n\t\t//kustomization.Images[i].NewName = newName\n\t}\n\n\t// Process any kustomize packages we depend on.\n\tfor _, r := range kustomization.Resources {\n\t\tif ext := strings.ToLower(filepath.Ext(r)); ext == \".yaml\" || ext == \".yml\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tp := path.Join(absPath, r)\n\n\t\tif b, err := utils.IsRemoteFile(p); b || err != nil {\n\t\t\tif err != nil {\n\t\t\t\tlog.Infof(\"Skipping path %v; there was an error determining if it was a local file; error: %v\", p, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Infof(\"Skipping remote file %v\", p)\n\t\t\tcontinue\n\t\t}\n\t\tif err := rt.processKustomizeDir(p, registry, include, exclude); err != nil {\n\t\t\tlog.Errorf(\"Error occurred while processing %v; error %v\", p, err)\n\t\t}\n\t}\n\n\t// Bases is deprecated but our manifests still use it.\n\tfor _, r := range kustomization.Bases {\n\t\tp := path.Join(absPath, r)\n\n\t\tif b, err := utils.IsRemoteFile(p); b || err != nil {\n\t\t\tif err != nil {\n\t\t\t\tlog.Infof(\"Skipping path %v; there was an error determining if it was a local file; error: %v\", p, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Infof(\"Skipping remote file %v\", p)\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := rt.processKustomizeDir(p, registry, include, exclude); err != nil {\n\t\t\tlog.Errorf(\"Error occurred while processing %v; error %v\", p, err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (rt *ReplicateTasks) fillTasks(directory string, registry string, buildContext string, include string, exclude string) error {\n\treturn filepath.Walk(directory, func(path string, info os.FileInfo, err error) error {\n\t\tif info.IsDir() {\n\t\t\tabsPath, err := filepath.Abs(path)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\treturn rt.processKustomizeDir(absPath, registry, include, exclude)\n\t\t}\n\n\t\treturn nil\n\t})\n}\n\nfunc verifyCurrDir() error {\n\tinfos, err := ioutil.ReadDir(\".\")\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\tfoundKus := false\n\tfor _, info := range infos {\n\t\tif info.IsDir() && info.Name() == KUSTOMIZE_FOLDER {\n\t\t\tfoundKus = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !foundKus {\n\t\treturn fmt.Errorf(\"kustomize folder not found, have you executed kfctl build yet?\")\n\t}\n\treturn nil\n}\n\nfunc UpdateKustomize(inputFile string) error {\n\tif err := verifyCurrDir(); err != nil {\n\t\treturn err\n\t}\n\tbuf, err := ioutil.ReadFile(inputFile)\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\tpipelineRun := pipeline.PipelineRun{}\n\tif err := yaml.Unmarshal(buf, &pipelineRun); err != nil {\n\t\treturn err\n\t}\n\timageMapping := make(map[string]string)\n\tfor _, task := range pipelineRun.Spec.PipelineSpec.Tasks {\n\t\toldImg := \"\"\n\t\tnewImg := \"\"\n\t\tfor _, param := range task.Params {\n\t\t\tif param.Name == INPUT_IMAGE {\n\t\t\t\toldImg = param.Value.StringVal\n\t\t\t}\n\t\t\tif param.Name == OUTPUT_IMAGE {\n\t\t\t\tnewImg = param.Value.StringVal\n\t\t\t}\n\t\t}\n\t\timageMapping[oldImg] = newImg\n\t\tlog.Infof(\"Updating image %v to %v\", oldImg, newImg)\n\t}\n\n\treturn filepath.Walk(KUSTOMIZE_FOLDER, func(path string, info os.FileInfo, err error) error {\n\t\tif info.IsDir() {\n\t\t\tabsPath, err := filepath.Abs(path)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tkustomizationFilePath := filepath.Join(absPath, \"kustomization.yaml\")\n\t\t\tif _, err := os.Stat(kustomizationFilePath); err == nil {\n\t\t\t\tkustomization := kustomize.GetKustomization(absPath)\n\t\t\t\trewrite := false\n\t\t\t\tfor i, image := range kustomization.Images {\n\t\t\t\t\tcurName := image.Name\n\t\t\t\t\tif image.NewName != \"\" {\n\t\t\t\t\t\tcurName = image.NewName\n\t\t\t\t\t}\n\t\t\t\t\tif (image.NewTag == \"\") == (image.Digest == \"\") {\n\t\t\t\t\t\tlog.Warnf(\"One and only one of NewTag or Digest can exist for image %s, skipping\\n\",\n\t\t\t\t\t\t\timage.Name)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif image.NewTag != \"\" {\n\t\t\t\t\t\tcurName = strings.Join([]string{curName, image.NewTag}, \":\")\n\t\t\t\t\t}\n\t\t\t\t\tif image.Digest != \"\" {\n\t\t\t\t\t\tcurName = strings.Join([]string{curName, image.Digest}, \"@\")\n\t\t\t\t\t}\n\t\t\t\t\tif newImg, ok := imageMapping[curName]; ok {\n\t\t\t\t\t\t// drop image tag before write back to kustomize\n\t\t\t\t\t\tidx := strings.Index(newImg, \":\")\n\t\t\t\t\t\tif idx == -1 {\n\t\t\t\t\t\t\tidx = strings.Index(newImg, \"@\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tkustomization.Images[i].NewName = newImg[:idx]\n\t\t\t\t\t\trewrite = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif rewrite {\n\t\t\t\t\tdata, err := yaml.Marshal(kustomization)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\n\t\t\t\t\twriteErr := ioutil.WriteFile(kustomizationFilePath, data, 0644)\n\t\t\t\t\tif writeErr != nil {\n\t\t\t\t\t\treturn errors.WithStack(writeErr)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\treturn nil\n\t})\n}\n"
  },
  {
    "path": "pkg/mirror/mirror_image_test.go",
    "content": "package mirror\n\nimport (\n\t\"bytes\"\n\tmirrorv1alpha1 \"github.com/kubeflow/kfctl/v3/pkg/apis/apps/imagemirror/v1alpha1\"\n\t\"github.com/kubeflow/kfctl/v3/pkg/utils\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n)\n\nconst KUSTOMIZATION = \"kustomize/kustomization.yaml\"\n\ntype testCase struct {\n\tExpected string\n\tActual   string\n}\n\nfunc init() {\n\tif err := os.Chdir(\"testdata\"); err != nil {\n\t\tlog.Errorf(\"Failed to change dir %v\", err)\n\t}\n}\n\nfunc TestGenerateMirroringPipeline(t *testing.T) {\n\tspec := mirrorv1alpha1.ReplicationSpec{\n\t\tPatterns: []mirrorv1alpha1.Pattern{\n\t\t\t{\n\t\t\t\tSrc: mirrorv1alpha1.SrcImages{\n\t\t\t\t\tExclude: \"gcr.io\",\n\t\t\t\t},\n\t\t\t\tDest: \"gcr.io/kubeflow-dev\",\n\t\t\t},\n\t\t},\n\t\tContext: \"gs://kubeflow-examples/image-replicate/replicate-context.tar.gz\",\n\t}\n\n\twd, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatalf(\"Could not get working directory; error %v\", err)\n\t}\n\tdirectory := path.Join(wd, \"kustomize\")\n\tif err := GenerateMirroringPipeline(directory, spec, \"pipeline.yaml\", true); err != nil {\n\t\tt.Error(err)\n\t}\n\tdefer func(t *testing.T) {\n\t\tif err := os.Remove(\"pipeline.yaml\"); err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t\tif err := os.Remove(\"cloudbuild.yaml\"); err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t}(t)\n\tcases := []testCase{\n\t\t{\n\t\t\tExpected: \"expected-pipeline.yaml\",\n\t\t\tActual:   \"pipeline.yaml\",\n\t\t},\n\t\t{\n\t\t\tExpected: \"expected-cloudbuild.yaml\",\n\t\t\tActual:   \"cloudbuild.yaml\",\n\t\t},\n\t}\n\tcompFile(cases, t)\n}\n\nfunc TestUpdateKustomize(t *testing.T) {\n\n\toriginal, err := ioutil.ReadFile(KUSTOMIZATION)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\t// Undo change after test run\n\tdefer func(t *testing.T) {\n\t\tif err := ioutil.WriteFile(KUSTOMIZATION, original, 0644); err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t}(t)\n\tif err := UpdateKustomize(\"expected-pipeline.yaml\"); err != nil {\n\t\tt.Error(err)\n\t}\n\tcases := []testCase{\n\t\t{\n\t\t\tExpected: \"expected-kustomization.yaml\",\n\t\t\tActual:   KUSTOMIZATION,\n\t\t},\n\t}\n\tcompFile(cases, t)\n}\n\nfunc compFile(cases []testCase, t *testing.T) {\n\tfor _, ca := range cases {\n\t\texpectedBytes, err := ioutil.ReadFile(ca.Expected)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t\tactualBytes, err := ioutil.ReadFile(ca.Actual)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t\tif !bytes.Equal(expectedBytes, actualBytes) {\n\t\t\tutils.PrintDiff(string(actualBytes), string(expectedBytes))\n\t\t\tt.Errorf(\"Result not matching; got\\n%v\\nwant\\n%v\", string(actualBytes), string(expectedBytes))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/mirror/testdata/base-pkg/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nimages:\n- name: docker.io/somerepo/image1\n  newName: docker.io/somerepo/image1\n  newTag: v0.16"
  },
  {
    "path": "pkg/mirror/testdata/expected-cloudbuild.yaml",
    "content": "images:\n- gcr.io/kubeflow-dev/docker.io/istio/citadel:1.1.6\n- gcr.io/kubeflow-dev/docker.io/istio/galley:1.1.6\n- gcr.io/kubeflow-dev/docker.io/istio/kubectl:1.1.6\n- gcr.io/kubeflow-dev/docker.io/istio/mixer:1.1.6\n- gcr.io/kubeflow-dev/docker.io/istio/pilot:1.1.6\n- gcr.io/kubeflow-dev/docker.io/istio/proxyv2:1.1.6\n- gcr.io/kubeflow-dev/docker.io/istio/sidecar_injector:1.1.6\n- gcr.io/kubeflow-dev/docker.io/jaegertracing/all-in-one:1.9\n- gcr.io/kubeflow-dev/docker.io/kiali/kiali:v0.16\n- gcr.io/kubeflow-dev/docker.io/prom/prometheus:v2.3.1\n- gcr.io/kubeflow-dev/docker.io/somerepo/image1:v0.16\n- gcr.io/kubeflow-dev/grafana/grafana:6.0.2\nsteps:\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/istio/citadel:1.1.6\n  - --build-arg=INPUT_IMAGE=docker.io/istio/citadel:1.1.6\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/istio/galley:1.1.6\n  - --build-arg=INPUT_IMAGE=docker.io/istio/galley:1.1.6\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/istio/kubectl:1.1.6\n  - --build-arg=INPUT_IMAGE=docker.io/istio/kubectl:1.1.6\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/istio/mixer:1.1.6\n  - --build-arg=INPUT_IMAGE=docker.io/istio/mixer:1.1.6\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/istio/pilot:1.1.6\n  - --build-arg=INPUT_IMAGE=docker.io/istio/pilot:1.1.6\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/istio/proxyv2:1.1.6\n  - --build-arg=INPUT_IMAGE=docker.io/istio/proxyv2:1.1.6\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/istio/sidecar_injector:1.1.6\n  - --build-arg=INPUT_IMAGE=docker.io/istio/sidecar_injector:1.1.6\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/jaegertracing/all-in-one:1.9\n  - --build-arg=INPUT_IMAGE=docker.io/jaegertracing/all-in-one:1.9\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/kiali/kiali:v0.16\n  - --build-arg=INPUT_IMAGE=docker.io/kiali/kiali:v0.16\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/prom/prometheus:v2.3.1\n  - --build-arg=INPUT_IMAGE=docker.io/prom/prometheus:v2.3.1\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/docker.io/somerepo/image1:v0.16\n  - --build-arg=INPUT_IMAGE=docker.io/somerepo/image1:v0.16\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n- args:\n  - build\n  - -t\n  - gcr.io/kubeflow-dev/grafana/grafana:6.0.2\n  - --build-arg=INPUT_IMAGE=grafana/grafana:6.0.2\n  - .\n  name: gcr.io/cloud-builders/docker\n  waitFor:\n  - '-'\n"
  },
  {
    "path": "pkg/mirror/testdata/expected-kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nimages:\n- name: docker.io/istio/kubectl\n  newName: gcr.io/kubeflow-dev/docker.io/istio/kubectl\n  newTag: 1.1.6\n- name: docker.io/istio/galley\n  newName: gcr.io/kubeflow-dev/docker.io/istio/galley\n  newTag: 1.1.6\n- name: docker.io/istio/proxyv2\n  newName: gcr.io/kubeflow-dev/docker.io/istio/proxyv2\n  newTag: 1.1.6\n- name: grafana/grafana\n  newName: gcr.io/kubeflow-dev/grafana/grafana\n  newTag: 6.0.2\n- name: docker.io/kiali/kiali\n  newName: gcr.io/kubeflow-dev/docker.io/kiali/kiali\n  newTag: v0.16\n- name: docker.io/istio/mixer\n  newName: gcr.io/kubeflow-dev/docker.io/istio/mixer\n  newTag: 1.1.6\n- name: docker.io/istio/pilot\n  newName: gcr.io/kubeflow-dev/docker.io/istio/pilot\n  newTag: 1.1.6\n- name: docker.io/prom/prometheus\n  newName: gcr.io/kubeflow-dev/docker.io/prom/prometheus\n  newTag: v2.3.1\n- name: docker.io/istio/citadel\n  newName: gcr.io/kubeflow-dev/docker.io/istio/citadel\n  newTag: 1.1.6\n- name: docker.io/istio/sidecar_injector\n  newName: gcr.io/kubeflow-dev/docker.io/istio/sidecar_injector\n  newTag: 1.1.6\n- name: docker.io/jaegertracing/all-in-one\n  newName: gcr.io/kubeflow-dev/docker.io/jaegertracing/all-in-one\n  newTag: \"1.9\"\nkind: Kustomization\nnamespace: kubeflow\nresources:\n- istio-noauth.yaml\n- ../base-pkg\n"
  },
  {
    "path": "pkg/mirror/testdata/expected-pipeline.yaml",
    "content": "apiVersion: tekton.dev/v1alpha1\nkind: PipelineRun\nmetadata:\n  creationTimestamp: null\n  name: replication-pipeline\nspec:\n  params:\n  - name: context\n    value: gs://kubeflow-examples/image-replicate/replicate-context.tar.gz\n  pipelineSpec:\n    params:\n    - name: context\n      type: string\n    tasks:\n    - name: 0-docker-io-istio-citadel-1-1-6\n      params:\n      - name: inputImage\n        value: docker.io/istio/citadel:1.1.6\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/istio/citadel:1.1.6\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 1-docker-io-istio-galley-1-1-6\n      params:\n      - name: inputImage\n        value: docker.io/istio/galley:1.1.6\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/istio/galley:1.1.6\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 2-docker-io-istio-kubectl-1-1-6\n      params:\n      - name: inputImage\n        value: docker.io/istio/kubectl:1.1.6\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/istio/kubectl:1.1.6\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 3-docker-io-istio-mixer-1-1-6\n      params:\n      - name: inputImage\n        value: docker.io/istio/mixer:1.1.6\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/istio/mixer:1.1.6\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 4-docker-io-istio-pilot-1-1-6\n      params:\n      - name: inputImage\n        value: docker.io/istio/pilot:1.1.6\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/istio/pilot:1.1.6\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 5-docker-io-istio-proxyv2-1-1-6\n      params:\n      - name: inputImage\n        value: docker.io/istio/proxyv2:1.1.6\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/istio/proxyv2:1.1.6\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 6-docker-io-istio-sidecar-injector-1-1-6\n      params:\n      - name: inputImage\n        value: docker.io/istio/sidecar_injector:1.1.6\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/istio/sidecar_injector:1.1.6\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 7-docker-io-jaegertracing-all-in-one-1-9\n      params:\n      - name: inputImage\n        value: docker.io/jaegertracing/all-in-one:1.9\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/jaegertracing/all-in-one:1.9\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 8-docker-io-kiali-kiali-v0-16\n      params:\n      - name: inputImage\n        value: docker.io/kiali/kiali:v0.16\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/kiali/kiali:v0.16\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 9-docker-io-prom-prometheus-v2-3-1\n      params:\n      - name: inputImage\n        value: docker.io/prom/prometheus:v2.3.1\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/prom/prometheus:v2.3.1\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 10-docker-io-somerepo-image1-v0-16\n      params:\n      - name: inputImage\n        value: docker.io/somerepo/image1:v0.16\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/docker.io/somerepo/image1:v0.16\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\n    - name: 11-grafana-grafana-6-0-2\n      params:\n      - name: inputImage\n        value: grafana/grafana:6.0.2\n      - name: outputImage\n        value: gcr.io/kubeflow-dev/grafana/grafana:6.0.2\n      - name: context\n        value: $(params.context)\n      taskRef:\n        name: mirror-image\nstatus: {}\n"
  },
  {
    "path": "pkg/mirror/testdata/kustomize/kustomization.yaml",
    "content": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n- istio-noauth.yaml\n- ../base-pkg\nnamespace: kubeflow\nimages:\n- name: docker.io/istio/kubectl\n  newName: docker.io/istio/kubectl\n  newTag: 1.1.6\n- name: docker.io/istio/galley\n  newName: docker.io/istio/galley\n  newTag: 1.1.6\n- name: docker.io/istio/proxyv2\n  newName: docker.io/istio/proxyv2\n  newTag: 1.1.6\n- name: grafana/grafana\n  newName: grafana/grafana\n  newTag: 6.0.2\n- name: docker.io/kiali/kiali\n  newName: docker.io/kiali/kiali\n  newTag: v0.16\n- name: docker.io/istio/mixer\n  newName: docker.io/istio/mixer\n  newTag: 1.1.6\n- name: docker.io/istio/pilot\n  newName: docker.io/istio/pilot\n  newTag: 1.1.6\n- name: docker.io/prom/prometheus\n  newName: docker.io/prom/prometheus\n  newTag: v2.3.1\n- name: docker.io/istio/citadel\n  newName: docker.io/istio/citadel\n  newTag: 1.1.6\n- name: docker.io/istio/sidecar_injector\n  newName: docker.io/istio/sidecar_injector\n  newTag: 1.1.6\n- name: docker.io/jaegertracing/all-in-one\n  newName: docker.io/jaegertracing/all-in-one\n  newTag: '1.9'\n"
  },
  {
    "path": "pkg/utils/awsutil.go",
    "content": "/*\nCopyright The Kubeflow Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage utils\n\nimport (\n\t\"fmt\"\n\t\"os/exec\"\n\t\"regexp\"\n\n\tawssdk \"github.com/aws/aws-sdk-go/aws\"\n\n\t\"github.com/aws/aws-sdk-go/aws/session\"\n\t\"github.com/aws/aws-sdk-go/service/sts\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\n// CheckAwsStsCallerIdentity runs GetCallIdentity to make sure aws credentials is configured correctly\nfunc CheckAwsStsCallerIdentity(sess *session.Session) error {\n\tsvc := sts.New(sess)\n\tinput := &sts.GetCallerIdentityInput{}\n\n\tresult, err := svc.GetCallerIdentity(input)\n\tif err != nil {\n\t\tlog.Warnf(\"AWS Credentials seems not correct %v\", err.Error())\n\t\treturn err\n\t}\n\n\tlog.Infof(\"Caller ARN Info: %s\", result)\n\treturn nil\n}\n\n// CheckAwsAccountId runs GetCallIdentity to retrieve account information\nfunc CheckAwsAccountId(sess *session.Session) (string, error) {\n\tsvc := sts.New(sess)\n\tinput := &sts.GetCallerIdentityInput{}\n\n\toutput, err := svc.GetCallerIdentity(input)\n\tif err != nil {\n\t\tlog.Warnf(\"AWS Credentials seems not correct %v\", err.Error())\n\t\treturn \"\", err\n\t}\n\n\treturn awssdk.StringValue(output.Account), nil\n}\n\n// CheckCommandExist check if a command can be found in PATH.\nfunc CheckCommandExist(commandName string) error {\n\t_, err := exec.LookPath(commandName)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// GetEksctlVersion return eksctl version on user's environment\nfunc GetEksctlVersion() (string, error) {\n\tlog.Infof(\"Running `eksctl version` ...\")\n\toutput, err := exec.Command(\"eksctl\", \"version\").Output()\n\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to run `eksctl version` command %v\", err)\n\t\treturn \"\", err\n\t}\n\n\t// [ℹ]  version.Info{BuiltAt:\"\", GitCommit:\"\", GitTag:\"0.1.32\"}\n\tr := regexp.MustCompile(\"[0-9]+.[0-9]+.[0-9]+\")\n\tmatchGroups := r.FindStringSubmatch(string(output))\n\n\tif len(matchGroups) == 0 {\n\t\treturn \"\", fmt.Errorf(\"can not find eksctl version from %v\", string(output))\n\t}\n\n\tversion := matchGroups[0]\n\tlog.Infof(\"eksctl version: %s\", version)\n\treturn version, nil\n}\n"
  },
  {
    "path": "pkg/utils/diff.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// PrintDiff pretty prints file differences.\n//\n// TODO(jlewi): We use this functionality across a lot of go packages; not just in kubeflow/kfctl but in other\n// repos like kubeflow/testing. We should think about moving it into its own go module so it can be easily reused.\nfunc PrintDiff(actual string, expected string) {\n\tsE, maxLen := convertToArray(expected)\n\tsA, _ := convertToArray(actual)\n\tformat := fmt.Sprintf(\"%%s  %%-%ds %%s\\n\", maxLen+4)\n\tlimit := 0\n\tif len(sE) < len(sA) {\n\t\tlimit = len(sE)\n\t} else {\n\t\tlimit = len(sA)\n\t}\n\tfmt.Printf(format, \" \", \"EXPECTED\", \"ACTUAL\")\n\tfmt.Printf(format, \" \", \"--------\", \"------\")\n\tfor i := 0; i < limit; i++ {\n\t\tfmt.Printf(format, hint(sE[i], sA[i]), sE[i], sA[i])\n\t}\n\tif len(sE) < len(sA) {\n\t\tfor i := len(sE); i < len(sA); i++ {\n\t\t\tfmt.Printf(format, \"X\", \"\", sA[i])\n\t\t}\n\t} else {\n\t\tfor i := len(sA); i < len(sE); i++ {\n\t\t\tfmt.Printf(format, \"X\", sE[i], \"\")\n\t\t}\n\t}\n}\n\nfunc tabToSpace(input string) string {\n\tvar result []string\n\tfor _, i := range input {\n\t\tif i == 9 {\n\t\t\tresult = append(result, \"  \")\n\t\t} else {\n\t\t\tresult = append(result, string(i))\n\t\t}\n\t}\n\treturn strings.Join(result, \"\")\n}\n\nfunc convertToArray(x string) ([]string, int) {\n\ta := strings.Split(strings.TrimSuffix(x, \"\\n\"), \"\\n\")\n\tmaxLen := 0\n\tfor i, v := range a {\n\t\tz := tabToSpace(v)\n\t\tif len(z) > maxLen {\n\t\t\tmaxLen = len(z)\n\t\t}\n\t\ta[i] = z\n\t}\n\treturn a, maxLen\n}\n\nfunc hint(a, b string) string {\n\tif a == b {\n\t\treturn \" \"\n\t}\n\treturn \"X\"\n}\n"
  },
  {
    "path": "pkg/utils/gcputils.go",
    "content": "/*\nCopyright The Kubeflow Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage utils\n\nimport (\n\t\"cloud.google.com/go/container/apiv1\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\t\"golang.org/x/net/context\"\n\t\"golang.org/x/oauth2\"\n\t\"google.golang.org/api/option\"\n\tcontainerpb \"google.golang.org/genproto/googleapis/container/v1\"\n\t\"k8s.io/client-go/rest\"\n\tclientcmdapi \"k8s.io/client-go/tools/clientcmd/api\"\n\t\"os/exec\"\n)\n\n// Use default token source and retrieve cluster information with given project/location/cluster\n// information.\nfunc GetClusterInfo(ctx context.Context, project string, loc string, cluster string, ts oauth2.TokenSource) (*containerpb.Cluster, error) {\n\tc, err := container.NewClusterManagerClient(ctx, option.WithTokenSource(ts))\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n\tgetClusterReq := &containerpb.GetClusterRequest{\n\t\tProjectId: project,\n\t\tZone:      loc,\n\t\tClusterId: cluster,\n\t}\n\tif cl, err := c.GetCluster(ctx, getClusterReq); err == nil {\n\t\treturn cl, nil\n\t} else {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\n// BuildConfigFromClusterInfo returns k8s config using gcloud Application Default Credentials\n// typically $HOME/.config/gcloud/application_default_credentials.json\nfunc BuildConfigFromClusterInfo(ctx context.Context, cluster *containerpb.Cluster, ts oauth2.TokenSource) (*rest.Config, error) {\n\tt, err := ts.Token()\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Token retrieval error: %v\", err.Error()),\n\t\t}\n\t}\n\tcaDec, _ := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClusterCaCertificate)\n\tconfig := &rest.Config{\n\t\tHost:        \"https://\" + cluster.Endpoint,\n\t\tBearerToken: t.AccessToken,\n\t\tTLSClientConfig: rest.TLSClientConfig{\n\t\t\tCAData: []byte(string(caDec)),\n\t\t},\n\t}\n\treturn config, nil\n}\n\n// Create a config that serves as kubeconfig.\nfunc CreateKubeconfig(ctx context.Context, project string, loc string, cluster string,\n\tnamespace string, ts oauth2.TokenSource) (*clientcmdapi.Config, error) {\n\tclusterInfo, err := GetClusterInfo(ctx, project, loc, cluster, ts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tconfig := clientcmdapi.NewConfig()\n\tconfig.Kind = \"Config\"\n\tt, err := ts.Token()\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Token retrieval error: %v\", err.Error()),\n\t\t}\n\t}\n\tcaDec, _ := base64.StdEncoding.DecodeString(clusterInfo.MasterAuth.ClusterCaCertificate)\n\tgcloudPath, err := exec.LookPath(\"gcloud\")\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Not able to find gcloud: %v\", err.Error()),\n\t\t}\n\t}\n\n\tconfig.Contexts[cluster] = &clientcmdapi.Context{\n\t\tCluster:   cluster,\n\t\tAuthInfo:  cluster,\n\t\tNamespace: namespace,\n\t}\n\tconfig.Clusters[cluster] = &clientcmdapi.Cluster{\n\t\tServer:                   \"https://\" + clusterInfo.Endpoint,\n\t\tInsecureSkipTLSVerify:    false,\n\t\tCertificateAuthorityData: []byte(string(caDec)),\n\t}\n\tconfig.AuthInfos[cluster] = &clientcmdapi.AuthInfo{\n\t\tToken: t.AccessToken,\n\t\tAuthProvider: &clientcmdapi.AuthProviderConfig{\n\t\t\tName: \"gcp\",\n\t\t\tConfig: map[string]string{\n\t\t\t\t\"cmd-path\":   gcloudPath,\n\t\t\t\t\"cmd-args\":   \"config config-helper --format=json\",\n\t\t\t\t\"token-key\":  \"{.credential.access_token}\",\n\t\t\t\t\"expiry-key\": \"{.credential.token_expiry}\",\n\t\t\t},\n\t\t},\n\t}\n\tconfig.CurrentContext = cluster\n\n\treturn config, nil\n}\n"
  },
  {
    "path": "pkg/utils/iamutils.go",
    "content": "/*\nCopyright The Kubeflow Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage utils\n\nimport (\n\t\"fmt\"\n\t\"github.com/deckarep/golang-set\"\n\t\"github.com/ghodss/yaml\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"golang.org/x/net/context\"\n\t\"google.golang.org/api/cloudresourcemanager/v1\"\n\t\"google.golang.org/api/iam/v1\"\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\nfunc transformSliceToInterface(slice []string) []interface{} {\n\tret := make([]interface{}, len(slice))\n\tfor i, m := range slice {\n\t\tret[i] = m\n\t}\n\treturn ret\n}\n\nfunc transformInterfaceToSlice(inter []interface{}) []string {\n\tret := make([]string, len(inter))\n\tfor i, m := range inter {\n\t\tret[i] = m.(string)\n\t}\n\treturn ret\n}\n\n// Gets IAM plicy from GCP for the whole project.\nfunc GetIamPolicy(project string, gcpClient *http.Client) (*cloudresourcemanager.Policy, error) {\n\tctx := context.Background()\n\tservice, serviceErr := cloudresourcemanager.New(gcpClient)\n\tif serviceErr != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: serviceErr.Error(),\n\t\t}\n\t}\n\treq := &cloudresourcemanager.GetIamPolicyRequest{}\n\tif policy, err := service.Projects.GetIamPolicy(project, req).Context(ctx).Do(); err == nil {\n\t\treturn policy, nil\n\t} else {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\n// Modify currentPolicy: Remove existing bindings associated with service accounts of current deployment\nfunc ClearIamPolicy(currentPolicy *cloudresourcemanager.Policy, deployName string, project string) {\n\tserviceAccounts := map[string]bool{\n\t\tfmt.Sprintf(\"serviceAccount:%v-admin@%v.iam.gserviceaccount.com\", deployName, project): true,\n\t\tfmt.Sprintf(\"serviceAccount:%v-user@%v.iam.gserviceaccount.com\", deployName, project):  true,\n\t\tfmt.Sprintf(\"serviceAccount:%v-vm@%v.iam.gserviceaccount.com\", deployName, project):    true,\n\t}\n\tvar newBindings []*cloudresourcemanager.Binding\n\tfor _, binding := range currentPolicy.Bindings {\n\t\tnewBinding := cloudresourcemanager.Binding{\n\t\t\tRole: binding.Role,\n\t\t}\n\t\tfor _, member := range binding.Members {\n\t\t\t// Skip bindings for service accounts of current deployment.\n\t\t\t// We'll reset bindings for them in following steps.\n\t\t\tif _, ok := serviceAccounts[member]; !ok {\n\t\t\t\tnewBinding.Members = append(newBinding.Members, member)\n\t\t\t}\n\t\t}\n\t\tnewBindings = append(newBindings, &newBinding)\n\t}\n\tcurrentPolicy.Bindings = newBindings\n}\n\n// TODO: Move type definitions to appropriate place.\ntype Members []string\ntype Roles []string\n\ntype Bindings struct {\n\tMembers Members\n\tRoles   Roles\n}\n\ntype IamBindingsYAML struct {\n\tBindings []Bindings\n}\n\n// Reads IAM bindings file in YAML format.\nfunc ReadIamBindingsYAML(filename string) (*cloudresourcemanager.Policy, error) {\n\tbuf, bufErr := ioutil.ReadFile(filename)\n\tif bufErr != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: bufErr.Error(),\n\t\t}\n\t}\n\n\tiam := IamBindingsYAML{}\n\tif err := yaml.Unmarshal(buf, &iam); err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n\n\tentries := make(map[string]mapset.Set)\n\tfor _, binding := range iam.Bindings {\n\t\tmembersSet := mapset.NewSetFromSlice(transformSliceToInterface(binding.Members))\n\t\tfor _, role := range binding.Roles {\n\t\t\tif m, ok := entries[role]; ok {\n\t\t\t\tm.Union(membersSet)\n\t\t\t} else {\n\t\t\t\tentries[role] = membersSet\n\t\t\t}\n\t\t}\n\t}\n\n\tpolicy := &cloudresourcemanager.Policy{}\n\tfor role, members := range entries {\n\t\tpolicy.Bindings = append(policy.Bindings, &cloudresourcemanager.Binding{\n\t\t\tRole:    role,\n\t\t\tMembers: transformInterfaceToSlice(members.ToSlice()),\n\t\t})\n\t}\n\n\treturn policy, nil\n}\n\n// Either patch or remove role bindings from `src` policy.\nfunc RewriteIamPolicy(currentPolicy *cloudresourcemanager.Policy, adding *cloudresourcemanager.Policy) {\n\tpolicyMap := map[string]map[string]bool{}\n\tfor _, binding := range currentPolicy.Bindings {\n\t\tpolicyMap[binding.Role] = make(map[string]bool)\n\t\tfor _, member := range binding.Members {\n\t\t\tpolicyMap[binding.Role][member] = true\n\t\t}\n\t}\n\n\tfor _, binding := range adding.Bindings {\n\t\tfor _, member := range binding.Members {\n\t\t\tif _, ok := policyMap[binding.Role]; !ok {\n\t\t\t\tpolicyMap[binding.Role] = make(map[string]bool)\n\t\t\t}\n\t\t\tpolicyMap[binding.Role][member] = true\n\t\t}\n\t}\n\tvar newBindings []*cloudresourcemanager.Binding\n\tfor role, memberSet := range policyMap {\n\t\tbinding := cloudresourcemanager.Binding{}\n\t\tbinding.Role = role\n\t\tfor member, exists := range memberSet {\n\t\t\tif exists {\n\t\t\t\tbinding.Members = append(binding.Members, member)\n\t\t\t}\n\t\t}\n\t\tnewBindings = append(newBindings, &binding)\n\t}\n\tcurrentPolicy.Bindings = newBindings\n}\n\n// \"Override\" project's IAM policy with given config.\nfunc SetIamPolicy(project string, policy *cloudresourcemanager.Policy, gcpClient *http.Client) error {\n\tctx := context.Background()\n\tservice, serviceErr := cloudresourcemanager.New(gcpClient)\n\tif serviceErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: serviceErr.Error(),\n\t\t}\n\t}\n\n\treq := &cloudresourcemanager.SetIamPolicyRequest{\n\t\tPolicy: policy,\n\t}\n\t_, err := service.Projects.SetIamPolicy(project, req).Context(ctx).Do()\n\tif err == nil {\n\t\treturn nil\n\t} else {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: err.Error(),\n\t\t}\n\t}\n}\n\n// UpdateWorkloadIdentityBindingsPolicy updates the (service account) IAM policy with workload identity binding.\nfunc UpdateWorkloadIdentityBindingsPolicy(currentPolicy *iam.Policy, project string, namespace string, ksa string) error {\n\tnewBinding := iam.Binding{}\n\tnewBinding.Role = \"roles/iam.workloadIdentityUser\"\n\tnewBinding.Members = []string{\n\t\tfmt.Sprintf(\"serviceAccount:%v.svc.id.goog[%v/%v]\", project, namespace, ksa),\n\t}\n\tcurrentPolicy.Bindings = append(currentPolicy.Bindings, &newBinding)\n\tlog.Infof(\"New policy: %v\", PrettyPrint(*currentPolicy))\n\treturn nil\n}\n\n// GetServingAccountIamPolicy gets IAM policy for a service account\nfunc GetServiceAccountIamPolicy(iamService *iam.Service, project string, gsa string) (*iam.Policy, error) {\n\tctx := context.Background()\n\tsaResource := fmt.Sprintf(\"projects/%v/serviceAccounts/%v\", project, gsa)\n\tcurrentPolicy, err := iamService.Projects.ServiceAccounts.GetIamPolicy(saResource).Context(ctx).Do()\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Get IAM Policy error: %v\", err),\n\t\t}\n\t}\n\treturn currentPolicy, nil\n}\n\n// SetServingAccountIamPolicy sets IAM policy for a service account\nfunc SetServiceAccountIamPolicy(iamService *iam.Service, policy *iam.Policy, project string, gsa string) error {\n\tctx := context.Background()\n\tsaResource := fmt.Sprintf(\"projects/%v/serviceAccounts/%v\", project, gsa)\n\treq := &iam.SetIamPolicyRequest{\n\t\tPolicy: policy,\n\t}\n\t_, setIamErr := iamService.Projects.ServiceAccounts.SetIamPolicy(saResource, req).Context(ctx).Do()\n\tif setIamErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Set IAM Policy error: %v\", setIamErr),\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/utils/iamutils_test.go",
    "content": "// Copyright 2018 The Kubeflow Authors\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\npackage utils\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"google.golang.org/api/cloudresourcemanager/v1\"\n\t\"google.golang.org/api/iam/v1\"\n)\n\nfunc Test(t *testing.T) {\n\ttype TestCase struct {\n\t\t// Arguments for GetUpdatedPolicy function.\n\t\tcurrentPolicy *cloudresourcemanager.Policy\n\t\t// service account policy pending change\n\t\tsaPolicy *cloudresourcemanager.Policy\n\n\t\t// Expected output policy\n\t\texpectedPolicy *cloudresourcemanager.Policy\n\t}\n\ttests := []TestCase{\n\t\t{\n\t\t\tcurrentPolicy: &cloudresourcemanager.Policy{\n\t\t\t\tBindings: []*cloudresourcemanager.Binding{\n\t\t\t\t\t&cloudresourcemanager.Binding{\n\t\t\t\t\t\tRole: \"roles/source.admin\",\n\t\t\t\t\t\tMembers: []string{\n\t\t\t\t\t\t\t\"serviceAccount:kfctl-admin@project.iam.gserviceaccount.com\",\n\t\t\t\t\t\t\t\"serviceAccount:kfctl-vm@project.iam.gserviceaccount.com\",\n\t\t\t\t\t\t\t\"serviceAccount:should-stay@project.iam.gserviceaccount.com\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t&cloudresourcemanager.Binding{\n\t\t\t\t\t\tRole: \"roles/editor\",\n\t\t\t\t\t\tMembers: []string{\n\t\t\t\t\t\t\t\"user:user1@google.com\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tEtag: \"ShouldKeep\",\n\t\t\t},\n\t\t\texpectedPolicy: &cloudresourcemanager.Policy{\n\t\t\t\tBindings: []*cloudresourcemanager.Binding{\n\t\t\t\t\t// 'kfctl' service accounts binding should be deleted\n\t\t\t\t\t// 'should-stay' service accounts binding should not be deleted\n\t\t\t\t\t&cloudresourcemanager.Binding{\n\t\t\t\t\t\tRole: \"roles/source.admin\",\n\t\t\t\t\t\tMembers: []string{\n\t\t\t\t\t\t\t\"serviceAccount:should-stay@project.iam.gserviceaccount.com\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t// 'user1@google.com' binding should not be deleted\n\t\t\t\t\t&cloudresourcemanager.Binding{\n\t\t\t\t\t\tRole: \"roles/editor\",\n\t\t\t\t\t\tMembers: []string{\n\t\t\t\t\t\t\t\"user:user1@google.com\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tEtag: \"ShouldKeep\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tClearIamPolicy(test.currentPolicy, \"kfctl\", \"project\")\n\t\tif !reflect.DeepEqual(test.currentPolicy, test.expectedPolicy) {\n\t\t\tt.Errorf(\"Expect:\\n%v; Output:\\n%v\", PolicyToString(test.expectedPolicy),\n\t\t\t\tPolicyToString(test.currentPolicy))\n\t\t}\n\t}\n}\n\nfunc Test_UpdateWorkloadIdentity(t *testing.T) {\n\ttype testCase struct {\n\t\tcurrentPolicy  *iam.Policy\n\t\tproject        string\n\t\tnamespace      string\n\t\tksa            string\n\t\texpectedPolicy *iam.Policy\n\t}\n\n\ttestCases := []testCase{\n\t\t{\n\t\t\tcurrentPolicy: &iam.Policy{},\n\t\t\tproject:       \"gcp-project\",\n\t\t\tnamespace:     \"ns1\",\n\t\t\tksa:           \"ksa\",\n\t\t\texpectedPolicy: &iam.Policy{\n\t\t\t\tBindings: []*iam.Binding{\n\t\t\t\t\t{\n\t\t\t\t\t\tRole: \"roles/iam.workloadIdentityUser\",\n\t\t\t\t\t\tMembers: []string{\n\t\t\t\t\t\t\t\"serviceAccount:gcp-project.svc.id.goog[ns1/ksa]\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range testCases {\n\t\tUpdateWorkloadIdentityBindingsPolicy(test.currentPolicy, test.project, test.namespace, test.ksa)\n\t\tif !reflect.DeepEqual(test.currentPolicy, test.expectedPolicy) {\n\t\t\tt.Errorf(\"Expect:\\n%v; Output:\\n%v\", IamPolicyToString(test.expectedPolicy),\n\t\t\t\tIamPolicyToString(test.currentPolicy))\n\t\t}\n\t}\n}\n\nfunc PolicyToString(input *cloudresourcemanager.Policy) string {\n\tpolicy, err := input.MarshalJSON()\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"Unable to parse policy: %v\", err)\n\t}\n\treturn string(policy)\n}\n\nfunc IamPolicyToString(input *iam.Policy) string {\n\tpolicy, err := input.MarshalJSON()\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"Unable to parse policy: %v\", err)\n\t}\n\treturn string(policy)\n}\n"
  },
  {
    "path": "pkg/utils/k8sAuth.go",
    "content": "package utils\n\nimport (\n\t\"encoding/base64\"\n\n\t\"cloud.google.com/go/container/apiv1\"\n\t\"golang.org/x/net/context\"\n\t\"golang.org/x/oauth2\"\n\t\"google.golang.org/api/option\"\n\tcontainerpb \"google.golang.org/genproto/googleapis/container/v1\"\n\t\"k8s.io/api/rbac/v1\"\n\tclientset \"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/rest\"\n\tclientcmdapi \"k8s.io/client-go/tools/clientcmd/api\"\n)\n\nfunc BuildClusterConfig(ctx context.Context, token string, project string, zone string,\n\tclusterID string) (*rest.Config, error) {\n\tts := oauth2.StaticTokenSource(&oauth2.Token{\n\t\tAccessToken: token,\n\t})\n\tc, err := container.NewClusterManagerClient(ctx, option.WithTokenSource(ts))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq := &containerpb.GetClusterRequest{\n\t\tProjectId: project,\n\t\tZone:      zone,\n\t\tClusterId: clusterID,\n\t}\n\tresp, err := c.GetCluster(ctx, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcaDec, _ := base64.StdEncoding.DecodeString(resp.MasterAuth.ClusterCaCertificate)\n\treturn &rest.Config{\n\t\tHost:        \"https://\" + resp.Endpoint,\n\t\tBearerToken: token,\n\t\tTLSClientConfig: rest.TLSClientConfig{\n\t\t\tCAData: []byte(string(caDec)),\n\t\t},\n\t}, nil\n}\n\n// BuildClientCmdAPI takeks k8s config and access token, build and return clientcmdapi.Config entry\nfunc BuildClientCmdAPI(config *rest.Config, token string) *clientcmdapi.Config {\n\treturn &clientcmdapi.Config{\n\t\tKind:       \"Config\",\n\t\tAPIVersion: \"v1\",\n\t\tClusters: map[string]*clientcmdapi.Cluster{\n\t\t\t\"activeCluster\": {\n\t\t\t\tCertificateAuthorityData: config.TLSClientConfig.CAData,\n\t\t\t\tServer:                   config.Host,\n\t\t\t},\n\t\t},\n\t\tContexts: map[string]*clientcmdapi.Context{\n\t\t\t\"activeCluster\": {\n\t\t\t\tCluster:  \"activeCluster\",\n\t\t\t\tAuthInfo: \"activeCluster\",\n\t\t\t},\n\t\t},\n\t\tCurrentContext: \"activeCluster\",\n\t\tAuthInfos: map[string]*clientcmdapi.AuthInfo{\n\t\t\t\"activeCluster\": {\n\t\t\t\tToken: token,\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc CreateK8sRoleBing(config *rest.Config, roleBinding *v1.ClusterRoleBinding) error {\n\tkubeClient, err := clientset.NewForConfig(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = kubeClient.RbacV1().ClusterRoleBindings().Create(roleBinding)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/utils/k8utils.go",
    "content": "/*\nCopyright (c) 2016-2017 Bitnami\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n    http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage utils\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/cenkalti/backoff\"\n\t\"github.com/ghodss/yaml\"\n\tgoyaml \"github.com/go-yaml/yaml\"\n\tgogetter \"github.com/hashicorp/go-getter\"\n\tconfigtypes \"github.com/kubeflow/kfctl/v3/config\"\n\tkfapis \"github.com/kubeflow/kfctl/v3/pkg/apis\"\n\tkftypes \"github.com/kubeflow/kfctl/v3/pkg/apis/apps\"\n\t\"github.com/pkg/errors\"\n\tlog \"github.com/sirupsen/logrus\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"k8s.io/api/core/v1\"\n\tk8serrors \"k8s.io/apimachinery/pkg/api/errors\"\n\t\"k8s.io/apimachinery/pkg/api/meta\"\n\tmetav1 \"k8s.io/apimachinery/pkg/apis/meta/v1\"\n\t\"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured\"\n\tk8stypes \"k8s.io/apimachinery/pkg/types\"\n\tk8syaml \"k8s.io/apimachinery/pkg/util/yaml\"\n\t\"k8s.io/cli-runtime/pkg/genericclioptions\"\n\t\"k8s.io/cli-runtime/pkg/printers\"\n\t\"k8s.io/client-go/kubernetes\"\n\t\"k8s.io/client-go/rest\"\n\tkubectlapply \"k8s.io/kubernetes/pkg/kubectl/cmd/apply\"\n\tkubectldelete \"k8s.io/kubernetes/pkg/kubectl/cmd/delete\"\n\tcmdutil \"k8s.io/kubernetes/pkg/kubectl/cmd/util\"\n\t\"math/rand\"\n\tnetUrl \"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"sigs.k8s.io/controller-runtime/pkg/client\"\n\t\"strings\"\n\t\"time\"\n\t// Auth plugins\n\t_ \"k8s.io/client-go/plugin/pkg/client/auth/azure\"\n\t_ \"k8s.io/client-go/plugin/pkg/client/auth/gcp\"\n\t_ \"k8s.io/client-go/plugin/pkg/client/auth/oidc\"\n)\n\nconst (\n\tYamlSeparator              = \"(?m)^---[ \\t]*$\"\n\tCertDir                    = \"/opt/ca\"\n\tcontrolPlaneLabel          = \"control-plane\"\n\tkatibMetricsCollectorLabel = \"katib-metricscollector-injection\"\n\tKfDefAnnotation            = \"kfctl.kubeflow.io\"\n\tForceDelete                = \"force-delete\"\n\tSetAnnotation              = \"set-kubeflow-annotation\"\n\tKfDefInstance              = \"kfdef-instance\"\n\tInstallByOperator          = \"install-by-operator\"\n)\n\nfunc generateRandStr(length int) string {\n\tchars := \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\tb := make([]byte, length)\n\tfor i := range b {\n\t\tb[i] = chars[rand.Intn(len(chars))]\n\t}\n\treturn string(b)\n}\n\nfunc NewDefaultBackoff() *backoff.ExponentialBackOff {\n\tb := backoff.NewExponentialBackOff()\n\tb.InitialInterval = 3 * time.Second\n\tb.MaxInterval = 30 * time.Second\n\tb.MaxElapsedTime = 5 * time.Minute\n\treturn b\n}\n\nfunc CreateResourceFromFile(config *rest.Config, filename string, elems ...configtypes.NameValue) error {\n\telemsMap := make(map[string]configtypes.NameValue)\n\tfor _, nv := range elems {\n\t\telemsMap[nv.Name] = nv\n\t}\n\tc, err := client.New(config, client.Options{})\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tdata, err := ioutil.ReadFile(filename)\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\tsplitter := regexp.MustCompile(YamlSeparator)\n\tobjectStrings := splitter.Split(string(data), -1)\n\tfor _, str := range objectStrings {\n\t\tif strings.TrimSpace(str) == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tu := &unstructured.Unstructured{}\n\t\tif err := yaml.Unmarshal([]byte(str), u); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tname := u.GetName()\n\t\tnamespace := u.GetNamespace()\n\t\tif namespace == \"\" {\n\t\t\tif val, exists := elemsMap[\"namespace\"]; exists {\n\t\t\t\tu.SetNamespace(val.Value)\n\t\t\t} else {\n\t\t\t\tu.SetNamespace(\"default\")\n\t\t\t}\n\t\t}\n\n\t\tlog.Infof(\"Creating %s\", name)\n\n\t\terr := c.Get(context.TODO(), k8stypes.NamespacedName{Name: name, Namespace: namespace}, u.DeepCopy())\n\t\tif err == nil {\n\t\t\tlog.Info(\"Object already exists...\")\n\t\t\tcontinue\n\t\t}\n\t\tif !k8serrors.IsNotFound(err) {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\terr = c.Create(context.TODO(), u)\n\t\tif err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// Checks if the path configFile is remote (e.g. http://github...)\nfunc IsRemoteFile(configFile string) (bool, error) {\n\tif configFile == \"\" {\n\t\treturn false, fmt.Errorf(\"config file must be a URI or a path\")\n\t}\n\turl, err := netUrl.Parse(configFile)\n\tif err != nil {\n\t\treturn false, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"Error parsing file path: %v\", err),\n\t\t}\n\t}\n\tif url.Scheme != \"\" {\n\t\treturn true, nil\n\t}\n\treturn false, nil\n}\n\nfunc GetObjectKindFromUri(configFile string) (string, error) {\n\tisRemoteFile, err := IsRemoteFile(configFile)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// We will read from appFile.\n\tappFile := configFile\n\tif isRemoteFile {\n\t\t// Download it to a tmp file, and set appFile.\n\t\tappDir, err := ioutil.TempDir(\"\", \"\")\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"Create a temporary directory to copy the file to.\")\n\t\t}\n\t\t// Open config file\n\t\tappFile = path.Join(appDir, \"tmp.yaml\")\n\n\t\tlog.Infof(\"Downloading %v to %v\", configFile, appFile)\n\t\terr = gogetter.GetFile(appFile, configFile)\n\t\tif err != nil {\n\t\t\treturn \"\", &kfapis.KfError{\n\t\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"could not fetch specified config %s: %v\", configFile, err),\n\t\t\t}\n\t\t}\n\t}\n\n\t// Read contents\n\tconfigFileBytes, err := ioutil.ReadFile(appFile)\n\tif err != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not read from config file %s: %v\", configFile, err),\n\t\t}\n\t}\n\n\tBUFSIZE := 1024\n\tbuf := bytes.NewBufferString(string(configFileBytes))\n\n\tjob := &unstructured.Unstructured{}\n\terr = k8syaml.NewYAMLOrJSONDecoder(buf, BUFSIZE).Decode(job)\n\tif err != nil {\n\t\treturn \"\", &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INVALID_ARGUMENT),\n\t\t\tMessage: fmt.Sprintf(\"could not decode specified config %s: %v\", configFile, err),\n\t\t}\n\t}\n\n\treturn job.GetKind(), nil\n}\n\nfunc DeleteResourceFromFile(config *rest.Config, filename string) error {\n\tc, err := client.New(config, client.Options{})\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\n\tdata, err := ioutil.ReadFile(filename)\n\tif err != nil {\n\t\treturn errors.WithStack(err)\n\t}\n\tsplitter := regexp.MustCompile(YamlSeparator)\n\tobjectStrings := splitter.Split(string(data), -1)\n\tfor _, str := range objectStrings {\n\t\tif strings.TrimSpace(str) == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tu := &unstructured.Unstructured{}\n\t\tif err := yaml.Unmarshal([]byte(str), u); err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\tname := u.GetName()\n\t\tnamespace := u.GetNamespace()\n\n\t\tlog.Infof(\"Deleting %s\", name)\n\n\t\terr := c.Get(context.TODO(), k8stypes.NamespacedName{Name: name, Namespace: namespace}, u.DeepCopy())\n\t\tif k8serrors.IsNotFound(err) {\n\t\t\tlog.Info(\"Object already deleted...\")\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\n\t\terr = c.Delete(context.TODO(), u)\n\t\tif err != nil {\n\t\t\treturn errors.WithStack(err)\n\t\t}\n\t}\n\treturn nil\n}\n\ntype Apply struct {\n\tmatchVersionKubeConfigFlags *cmdutil.MatchVersionFlags\n\tfactory                     cmdutil.Factory\n\tclientset                   *kubernetes.Clientset\n\toptions                     *kubectlapply.ApplyOptions\n\ttmpfile                     *os.File\n\tstdin                       *os.File\n}\n\nfunc NewApply(namespace string, restConfig *rest.Config) (*Apply, error) {\n\tconfigFlags := genericclioptions.NewConfigFlags(false)\n\tif restConfig != nil {\n\t\tcertFile := path.Join(CertDir, generateRandStr(10))\n\t\tif err := ioutil.WriteFile(certFile, restConfig.TLSClientConfig.CAData, 0644); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tconfigFlags.CAFile = &certFile\n\t\tconfigFlags.BearerToken = &(restConfig.BearerToken)\n\t\tconfigFlags.APIServer = &(restConfig.Host)\n\t}\n\tapply := &Apply{\n\t\tmatchVersionKubeConfigFlags: cmdutil.NewMatchVersionFlags(configFlags),\n\t}\n\tapply.factory = cmdutil.NewFactory(apply.matchVersionKubeConfigFlags)\n\tclientset, err := apply.factory.KubernetesClientSet()\n\tif err != nil {\n\t\treturn nil, &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not get clientset: %v\", err),\n\t\t}\n\t}\n\tapply.clientset = clientset\n\terr = apply.namespace(namespace)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Change behaviour of error from exit to panic.\n\tcmdutil.BehaviorOnFatal(func(s string, i int) {\n\t\tpanic(fmt.Errorf(\"Encountered error: %s. Exiting with code: %d.\", s, i))\n\t})\n\n\treturn apply, nil\n}\n\nfunc (a *Apply) IfNamespaceExist(name string) bool {\n\t_, nsMissingErr := a.clientset.CoreV1().Namespaces().Get(name, metav1.GetOptions{})\n\tif nsMissingErr != nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (a *Apply) Apply(data []byte) error {\n\ta.tmpfile = a.tempFile(data)\n\ta.stdin = os.Stdin\n\tos.Stdin = a.tmpfile\n\tdefer a.cleanup()\n\tioStreams := genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}\n\ta.options = kubectlapply.NewApplyOptions(ioStreams)\n\ta.options.DeleteFlags = a.deleteFlags(\"that contains the configuration to apply\")\n\tinitializeErr := a.init()\n\tif initializeErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"could not initialize : %v\", initializeErr),\n\t\t}\n\t}\n\tvar err error\n\tfunc() {\n\t\tdefer func() {\n\t\t\tif temp := recover(); temp != nil {\n\t\t\t\terr = temp.(error)\n\t\t\t}\n\t\t}()\n\t\terr = a.run()\n\t}()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (a *Apply) run() error {\n\tresourcesErr := a.options.Run()\n\tif resourcesErr != nil {\n\t\treturn &kfapis.KfError{\n\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\tMessage: fmt.Sprintf(\"Apply.Run : %v\", resourcesErr),\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (a *Apply) cleanup() error {\n\tos.Stdin = a.stdin\n\tif a.tmpfile != nil {\n\t\tif err := a.tmpfile.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn os.Remove(a.tmpfile.Name())\n\t}\n\treturn nil\n}\n\nfunc (a *Apply) init() error {\n\tvar err error\n\tvar o = a.options\n\tvar f = a.factory\n\t// allow for a success message operation to be specified at print time\n\to.ToPrinter = func(operation string) (printers.ResourcePrinter, error) {\n\t\to.PrintFlags.NamePrintFlags.Operation = operation\n\t\tif o.DryRun {\n\t\t\terr = o.PrintFlags.Complete(\"%s (dry run)\")\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tif o.ServerDryRun {\n\t\t\terr = o.PrintFlags.Complete(\"%s (server dry run)\")\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\treturn o.PrintFlags.ToPrinter()\n\t}\n\to.DiscoveryClient, err = f.ToDiscoveryClient()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdynamicClient, err := f.DynamicClient()\n\tif err != nil {\n\t\treturn err\n\t}\n\to.DeleteOptions = o.DeleteFlags.ToOptions(dynamicClient, o.IOStreams)\n\to.OpenAPIPatch = true\n\to.OpenAPISchema, _ = f.OpenAPISchema()\n\to.Validator, err = f.Validator(false)\n\to.Builder = f.NewBuilder()\n\to.Mapper, err = f.ToRESTMapper()\n\tif err != nil {\n\t\treturn err\n\t}\n\to.DynamicClient, err = f.DynamicClient()\n\tif err != nil {\n\t\treturn err\n\t}\n\to.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (a *Apply) patchNamespaceWithLabel(namespace string, labelKey string,\n\tlabelValue string) error {\n\tvar labelPatchMap = map[string]metav1.ObjectMeta{\n\t\t\"metadata\": metav1.ObjectMeta{\n\t\t\tLabels: map[string]string{labelKey: labelValue},\n\t\t},\n\t}\n\tlabelPatchJSON, err := json.Marshal(labelPatchMap)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlog.Infof(\"Labeling Namespace: %v\", namespace)\n\t_, err = a.clientset.CoreV1().Namespaces().Patch(\n\t\tnamespace,\n\t\t\"application/strategic-merge-patch+json\",\n\t\t[]byte(labelPatchJSON),\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (a *Apply) namespace(namespace string) error {\n\tlog.Infof(string(kftypes.NAMESPACE)+\": %v\", namespace)\n\tnamespaceInstance, nsMissingErr := a.clientset.CoreV1().Namespaces().Get(\n\t\tnamespace, metav1.GetOptions{},\n\t)\n\tif nsMissingErr != nil {\n\t\tlog.Infof(\"Creating namespace: %v\", namespace)\n\t\tnsSpec := &v1.Namespace{\n\t\t\tObjectMeta: metav1.ObjectMeta{\n\t\t\t\tName: namespace,\n\t\t\t\tLabels: map[string]string{\n\t\t\t\t\tcontrolPlaneLabel:          \"kubeflow\",\n\t\t\t\t\tkatibMetricsCollectorLabel: \"enabled\",\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t\t_, nsErr := a.clientset.CoreV1().Namespaces().Create(nsSpec)\n\t\tif nsErr != nil {\n\t\t\treturn &kfapis.KfError{\n\t\t\t\tCode: int(kfapis.INVALID_ARGUMENT),\n\t\t\t\tMessage: fmt.Sprintf(\"couldn't create %v %v Error: %v\",\n\t\t\t\t\tstring(kftypes.NAMESPACE), namespace, nsErr),\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif _, ok := namespaceInstance.ObjectMeta.Labels[controlPlaneLabel]; !ok {\n\t\t\tpatchErr := a.patchNamespaceWithLabel(\n\t\t\t\tnamespace, controlPlaneLabel, \"kubeflow\",\n\t\t\t)\n\t\t\tif patchErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't patch %v Error: %v\", namespace, patchErr),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif _, ok := namespaceInstance.ObjectMeta.Labels[katibMetricsCollectorLabel]; !ok {\n\t\t\tpatchErr := a.patchNamespaceWithLabel(\n\t\t\t\tnamespace, katibMetricsCollectorLabel, \"enabled\",\n\t\t\t)\n\t\t\tif patchErr != nil {\n\t\t\t\treturn &kfapis.KfError{\n\t\t\t\t\tCode:    int(kfapis.INTERNAL_ERROR),\n\t\t\t\t\tMessage: fmt.Sprintf(\"couldn't patch %v Error: %v\", namespace, patchErr),\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (a *Apply) tempFile(data []byte) *os.File {\n\ttmpfile, err := ioutil.TempFile(\"/tmp\", \"kout\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tif _, err := tmpfile.Write(data); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tif _, err := tmpfile.Seek(0, 0); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\treturn tmpfile\n}\n\nfunc (a *Apply) deleteFlags(usage string) *kubectldelete.DeleteFlags {\n\tcascade := true\n\tgracePeriod := -1\n\t// setup command defaults\n\tall := false\n\tforce := false\n\tignoreNotFound := false\n\tnow := false\n\toutput := \"\"\n\tlabelSelector := \"\"\n\tfieldSelector := \"\"\n\ttimeout := time.Duration(0)\n\twait := true\n\tfilenames := []string{a.tmpfile.Name()}\n\trecursive := false\n\treturn &kubectldelete.DeleteFlags{\n\t\tFileNameFlags:  &genericclioptions.FileNameFlags{Usage: usage, Filenames: &filenames, Recursive: &recursive},\n\t\tLabelSelector:  &labelSelector,\n\t\tFieldSelector:  &fieldSelector,\n\t\tCascade:        &cascade,\n\t\tGracePeriod:    &gracePeriod,\n\t\tAll:            &all,\n\t\tForce:          &force,\n\t\tIgnoreNotFound: &ignoreNotFound,\n\t\tNow:            &now,\n\t\tTimeout:        &timeout,\n\t\tWait:           &wait,\n\t\tOutput:         &output,\n\t}\n}\n\n// DeleteResource removes resource. Prior to that it checks whether the resource is created through the kubeflow operator.\n// always removes the resource if it is not created by the Kubeflow operator, otherwise checks the annotation to\n// be sure the resource is part of the deployment and then remove.\nfunc DeleteResource(resourceBytes []byte, kubeclient client.Client, timeout time.Duration, byOperator bool) error {\n\n\t// Convert to unstructured in order to access object metadata\n\tresourceMap := map[string]interface{}{}\n\terr := yaml.Unmarshal(resourceBytes, &resourceMap)\n\tif err != nil {\n\t\treturn err\n\t}\n\tunstructuredObject := &unstructured.Unstructured{\n\t\tObject: resourceMap,\n\t}\n\tname, namespace := unstructuredObject.GetName(), unstructuredObject.GetNamespace()\n\n\tlog.Infof(\"Deleting Kind '%s' in APIVersion '%s' with name '%s' in namespace '%s'\",\n\t\tunstructuredObject.GetKind(), unstructuredObject.GetAPIVersion(), name, namespace)\n\n\t// Check if resource exists\n\terr = kubeclient.Get(context.TODO(), k8stypes.NamespacedName{Name: name, Namespace: namespace}, unstructuredObject)\n\tif k8serrors.IsNotFound(err) {\n\t\tlog.Warnf(\"Resource %s/%s not found\", namespace, name)\n\t\treturn nil\n\t}\n\tif _, ok := err.(*meta.NoKindMatchError); ok {\n\t\tlog.Warnf(\"No matches for Kind %s in Group %s\", unstructuredObject.GetKind(), unstructuredObject.GetAPIVersion())\n\t\treturn nil\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// if the func is called by the Kubeflow operator, validate it is installed through the operator\n\tif byOperator {\n\t\tanns := unstructuredObject.GetAnnotations()\n\t\tkfdefAnn := strings.Join([]string{KfDefAnnotation, KfDefInstance}, \"/\")\n\t\t_, found := anns[kfdefAnn]\n\t\tif !found {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\t// Resource exists, try to delete\n\tif unstructuredObject.GetDeletionTimestamp().IsZero() {\n\t\terr = kubeclient.Delete(context.TODO(), unstructuredObject)\n\t\tif err != nil {\n\t\t\treturn errors.Wrapf(err, \"Failed to delete resource %s/%s\", namespace, name)\n\t\t}\n\t}\n\n\t// Delete succeeded, poll until the delete is completed\n\tinterval := 5 * time.Second\n\tb := backoff.WithMaxRetries(backoff.NewConstantBackOff(interval), uint64(timeout/interval+1))\n\terr = backoff.Retry(func() error {\n\t\terr := kubeclient.Get(context.TODO(), k8stypes.NamespacedName{Name: name, Namespace: namespace}, unstructuredObject.DeepCopy())\n\t\tif !k8serrors.IsNotFound(err) {\n\t\t\treturn errors.New(\"deleted resource is not cleaned up yet\")\n\t\t}\n\t\treturn nil\n\t}, b)\n\tif err != nil {\n\t\treturn errors.New(fmt.Sprintf(\"Timed out waiting for resource %s/%s to be deleted. Error %v\", namespace, name, err))\n\t}\n\n\treturn nil\n}\n\nfunc SplitYAML(resources []byte) ([][]byte, error) {\n\n\tdec := goyaml.NewDecoder(bytes.NewReader(resources))\n\n\tvar res [][]byte\n\tfor {\n\t\tvar value interface{}\n\t\terr := dec.Decode(&value)\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvalueBytes, err := goyaml.Marshal(value)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tres = append(res, valueBytes)\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "pkg/utils/k8utils_test.go",
    "content": "package utils\n\nimport (\n\t\"testing\"\n)\n\nfunc Test_IsRemoteFile(t *testing.T) {\n\ttype testCase struct {\n\t\tfilePath string\n\t\tisRemote bool\n\t}\n\n\ttestCases := []testCase{\n\t\t{\n\t\t\tfilePath: \"http://github.com\",\n\t\t\tisRemote: true,\n\t\t},\n\t\t{\n\t\t\tfilePath: \"../abc.txt\",\n\t\t\tisRemote: false,\n\t\t},\n\t\t{\n\t\t\tfilePath: \"/ab/c.txt\",\n\t\t\tisRemote: false,\n\t\t},\n\t\t{\n\t\t\tfilePath: \"abc.txt\",\n\t\t\tisRemote: false,\n\t\t},\n\t}\n\n\tfor _, test := range testCases {\n\t\tisRemote, err := IsRemoteFile(test.filePath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Error checking IsRemoteFile: %v\", err)\n\t\t}\n\t\tif isRemote != test.isRemote {\n\t\t\tt.Errorf(\"check if path %v is remote; expect %v, got %v\", test.filePath, test.isRemote, isRemote)\n\t\t}\n\t}\n}\n\nfunc TestSplitYAML(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tyaml     []byte\n\t\texpected [][]byte\n\t}{\n\t\t{\n\t\t\tname:     \"simple\",\n\t\t\tyaml:     []byte(\"a: b\\n---\\nc: d\"),\n\t\t\texpected: [][]byte{[]byte(\"a: b\\n\"), []byte(\"c: d\\n\")},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tresources, err := SplitYAML(test.yaml)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Unexpected error: %v\", err)\n\t\t\t}\n\t\t\tfor idx := range resources {\n\t\t\t\tif string(resources[idx]) != string(test.expected[idx]) {\n\t\t\t\t\tt.Fatalf(\"Resource in place %v. Got '%s', Want '%s'.\", idx, resources[idx], test.expected[idx])\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/utils/kindsorter.go",
    "content": "package utils\n\nimport (\n\t\"sigs.k8s.io/kustomize/v3/pkg/resource\"\n\t\"sort\"\n)\n\n// SortOrder is an ordering of Kinds.\ntype SortOrder []string\n\n// InstallOrder is the order in which resources should be installed (by Kind).\n\n// Those occurring earlier in the list get installed before those occurring later in the list.\nvar InstallOrder SortOrder = []string{\n\t\"Namespace\",\n\t\"ResourceQuota\",\n\t\"LimitRange\",\n\t\"PodSecurityPolicy\",\n\t\"Secret\",\n\t\"ConfigMap\",\n\t\"StorageClass\",\n\t\"PersistentVolume\",\n\t\"PersistentVolumeClaim\",\n\t\"ServiceAccount\",\n\t\"CustomResourceDefinition\",\n\t\"ClusterRole\",\n\t\"ClusterRoleBinding\",\n\t\"Role\",\n\t\"RoleBinding\",\n\t\"Service\",\n\t\"DaemonSet\",\n\t\"Pod\",\n\t\"ReplicationController\",\n\t\"ReplicaSet\",\n\t\"Deployment\",\n\t\"StatefulSet\",\n\t\"Job\",\n\t\"CronJob\",\n\t\"Ingress\",\n\t\"MutatingWebhookConfiguration\",\n\t\"ValidatingWebhookConfiguration\",\n\t\"APIService\",\n}\n\n// UninstallOrder is the order in which resources should be uninstalled (by Kind).\n// Those occurring earlier in the list get uninstalled before those occurring later in the list.\n// Reason to move CustomResourceDefinition earlier is we want to leverage finalizer to delete created resources\n// like profile -> namespaces, etc\nvar UninstallOrder SortOrder = []string{\n\t\"APIService\",\n\t\"ValidatingWebhookConfiguration\",\n\t\"MutatingWebhookConfiguration\",\n\t\"CustomResourceDefinition\",\n\t\"Ingress\",\n\t\"Service\",\n\t\"CronJob\",\n\t\"Job\",\n\t\"StatefulSet\",\n\t\"Deployment\",\n\t\"ReplicaSet\",\n\t\"ReplicationController\",\n\t\"Pod\",\n\t\"DaemonSet\",\n\t\"RoleBinding\",\n\t\"Role\",\n\t\"ClusterRoleBinding\",\n\t\"ClusterRole\",\n\t\"ServiceAccount\",\n\t\"PersistentVolumeClaim\",\n\t\"PersistentVolume\",\n\t\"StorageClass\",\n\t\"ConfigMap\",\n\t\"Secret\",\n\t\"PodSecurityPolicy\",\n\t\"LimitRange\",\n\t\"ResourceQuota\",\n\t\"Namespace\",\n}\n\n// SortByKind does an in-place sort of resources by Kind. Results are sorted by 'ordering'\nfunc SortByKind(manifests []*resource.Resource, ordering SortOrder) []*resource.Resource {\n\tks := newKindSorter(manifests, ordering)\n\tsort.Sort(ks)\n\treturn ks.resources\n}\n\ntype kindSorter struct {\n\tordering  map[string]int\n\tresources []*resource.Resource\n}\n\nfunc newKindSorter(r []*resource.Resource, s SortOrder) *kindSorter {\n\to := make(map[string]int, len(s))\n\tfor v, k := range s {\n\t\to[k] = v\n\t}\n\n\treturn &kindSorter{\n\t\tresources: r,\n\t\tordering:  o,\n\t}\n}\n\nfunc (k *kindSorter) Len() int { return len(k.resources) }\n\nfunc (k *kindSorter) Swap(i, j int) { k.resources[i], k.resources[j] = k.resources[j], k.resources[i] }\n\nfunc (k *kindSorter) Less(i, j int) bool {\n\ta := k.resources[i]\n\tb := k.resources[j]\n\tfirst, aok := k.ordering[a.GetKind()]\n\tsecond, bok := k.ordering[b.GetKind()]\n\t// if same kind (including unknown) sub sort alphanumeric\n\tif first == second {\n\t\t// if both are unknown and of different kind sort by kind alphabetically\n\t\tif !aok && !bok && a.GetKind() != b.GetKind() {\n\t\t\treturn a.GetKind() < b.GetKind()\n\t\t}\n\t\treturn a.GetKind() < b.GetKind()\n\t}\n\t// unknown kind is last\n\tif !aok {\n\t\treturn false\n\t}\n\tif !bok {\n\t\treturn true\n\t}\n\t// sort different kinds\n\treturn first < second\n}\n"
  },
  {
    "path": "pkg/utils/logging.go",
    "content": "package utils\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\tlog \"github.com/sirupsen/logrus\"\n)\n\n// PrettyPrint returns a pretty format output of any value.\nfunc PrettyPrint(value interface{}) string {\n\tif s, ok := value.(string); ok {\n\t\treturn s\n\t}\n\tvalueJson, err := json.MarshalIndent(value, \"\", \"  \")\n\tif err != nil {\n\t\tlog.Errorf(\"Failed to marshal value; error %v\", err)\n\t\treturn fmt.Sprintf(\"%+v\", value)\n\t}\n\treturn string(valueJson)\n}\n"
  },
  {
    "path": "prow_config.yaml",
    "content": "## This file configures the workflows to trigger in our Prow jobs.\n## see kubeflow/testing/py/run_e2e_workflow.py\npython_paths:\n  # Need to place kubeflow/testing in front of kubeflow/testing so that the package can\n  # be correctly located.\n  - kubeflow/testing/py\n  - kubeflow/kfctl/py\nworkflows:\n  - py_func: kubeflow.kfctl.testing.ci.kfctl_e2e_workflow.create_workflow\n    name: kfctl-e2e\n    job_types:\n     # Disable presubmit E2E test because large refactoring in manifests repo\n     # Details can be found https://github.com/kubeflow/manifests/pull/1719\n     # - presubmit\n     - periodic\n    include_dirs:\n      - config/*\n      - cmd/*\n      - pkg/*\n      - py/*\n    kwargs:\n      build_and_apply: false\n      config_path: https://raw.githubusercontent.com/kubeflow/manifests/master/kfdef/kfctl_istio_dex.yaml\n"
  },
  {
    "path": "py/kubeflow/__init__.py",
    "content": "__path__ = __import__('pkgutil').extend_path(__path__, __name__)\n"
  },
  {
    "path": "py/kubeflow/kfctl/__init__.py",
    "content": ""
  },
  {
    "path": "py/kubeflow/kfctl/testing/__init__.py",
    "content": ""
  },
  {
    "path": "py/kubeflow/kfctl/testing/ci/__init__.py",
    "content": ""
  },
  {
    "path": "py/kubeflow/kfctl/testing/ci/kfctl_e2e_workflow.py",
    "content": "\"\"\"\"Define the E2E workflow for kfctl.\n\nRapid iteration.\n\nHere are some pointers for rapidly iterating on the workflow during development.\n\n1. You can use the e2e_tool.py to directly launch the workflow on a K8s cluster.\n   If you don't have CLI access to the kubeflow-ci cluster (most folks) then\n   you would need to setup your own test cluster.\n\n2. To avoid redeploying on successive runs set the following parameters\n   --app_name=name for kfapp\n   --delete_kubeflow=False\n\n   Setting these parameters will cause the same KF deployment to be reused\n   across invocations. As a result successive runs won't have to redeploy KF.\n\nExample running with E2E tool\n\nexport PYTHONPATH=${PYTHONPATH}:${KFCTL_REPO}/py:${KUBEFLOW_TESTING_REPO}/py\n\npython -m kubeflow.testing.e2e_tool apply \\\n  kubeflow.kfctl.testing.ci.kfctl_e2e_workflow.create_workflow\n  --name=${USER}-kfctl-test-$(date +%Y%m%d-%H%M%S) \\\n  --namespace=kubeflow-test-infra \\\n  --test-endpoint=true \\\n  --kf-app-name=${KFAPPNAME} \\\n  --delete-kf=false\n  --open-in-chrome=true\n\nWe set kf-app-name and delete-kf to false to allow reusing the deployment\nacross successive runs.\n\nTo use code from a pull request set the prow envariables; e.g.\n\nexport JOB_NAME=\"jlewi-test\"\nexport JOB_TYPE=\"presubmit\"\nexport BUILD_ID=1234\nexport PROW_JOB_ID=1234\nexport REPO_OWNER=kubeflow\nexport REPO_NAME=kubeflow\nexport PULL_NUMBER=4148\n\"\"\"\n\nfrom kubeflow.testing import argo_build_util\nfrom kubeflow.testing import util\nimport logging\nimport os\nimport uuid\n\n# The name of the NFS volume claim to use for test files.\nNFS_VOLUME_CLAIM = \"nfs-external\"\n# The name to use for the volume to use to contain test data\nDATA_VOLUME = \"kubeflow-test-volume\"\n\n# This is the main dag with the entrypoint\nE2E_DAG_NAME = \"e2e\"\nEXIT_DAG_NAME = \"exit-handler\"\n\nTEMPLATE_LABEL = \"kfctl_e2e\"\n\nDEFAULT_REPOS = [\n    \"kubeflow/kfctl@HEAD\",\n    \"kubeflow/kubeflow@HEAD\",\n    \"kubeflow/testing@HEAD\",\n    \"kubeflow/tf-operator@HEAD\"\n]\n\nclass Builder(object):\n  def __init__(self, name=None, namespace=\"kubeflow-test-infra\",\n               config_path=(\"https://raw.githubusercontent.com/kubeflow\"\n                            \"/manifests/master/kfdef/kfctl_istio_dex.v1.1.0.yaml\"),\n               bucket=\"aws-kubeflow-jenkins\",\n               use_basic_auth=False,\n               build_and_apply=False,\n               test_target_name=None,\n               eks_cluster_version=\"1.17\",\n               extra_repos=\"\",\n               **kwargs):\n    \"\"\"Initialize a builder.\n    Args:\n      name: Name for the workflow.\n      namespace: Namespace for the workflow.\n      config_path: Path to the KFDef spec file.\n      bucket: The bucket to upload artifacts to. If not set use default determined by prow_artifacts.py.\n      test_endpoint: Whether to test the endpoint is ready.\n      use_basic_auth: Whether to use basic_auth.\n      test_target_name: (Optional) Name to use as the test target to group\n        tests.\n      delete_kf: (Optional) Don't run the step to delete Kubeflow. Set to\n        true if you want to leave the deployment up for some reason.\n    \"\"\"\n    self.name = name\n    self.namespace = namespace\n    self.bucket = bucket if bucket else self.bucket\n    self.config_path = config_path\n    self.build_and_apply = build_and_apply\n    #****************************************************************************\n    # Define directory locations\n    #****************************************************************************\n    # mount_path is the directory where the volume to store the test data\n    # should be mounted.\n    self.mount_path = \"/mnt/\" + \"test-data-volume\"\n    # test_dir is the root directory for all data for a particular test run.\n    self.test_dir = self.mount_path + \"/\" + self.name\n    # output_dir is the directory to sync to S3 to contain the output for this\n    # job.\n    self.output_dir = self.test_dir + \"/output\"\n    self.artifactsDir = self.output_dir + \"/artifacts\"\n\n    # We prefix the artifacts directory with junit because\n    # that's what spyglass/prow requires. This ensures multiple\n    # instances of a workflow triggered by the same prow job\n    # don't end up clobbering each other\n    self.artifacts_dir = self.output_dir + \"/artifacts/junit_{0}\".format(name)\n\n    # source directory where all repos should be checked out\n    self.src_root_dir = self.test_dir + \"/src\"\n    # The directory containing the kubeflow/kfctl repo\n    self.src_dir = self.src_root_dir + \"/kubeflow/kfctl\"\n    self.kubeflow_dir = self.src_root_dir + \"/kubeflow/kubeflow\"\n\n    # Directory in kubeflow/kfctl containing the pytest files.\n    self.kfctl_pytest_dir = os.path.join(self.src_dir, \"py/kubeflow/kfctl/testing/pytests\")\n\n    # Top level directories for python testing code in kfctl.\n    self.kfctl_py = os.path.join(self.src_dir, \"py\")\n\n    # Build a string of key value pairs that can be passed to various test\n    # steps to allow them to do substitution into different values.\n    values = {\n      \"srcrootdir\": self.src_root_dir,\n    }\n\n    value_pairs = [\"{0}={1}\".format(k,v) for k,v in values.items()]\n    self.values_str = \",\".join(value_pairs)\n\n    # The directory within the kubeflow_testing submodule containing\n    # py scripts to use.\n    self.kubeflow_testing_py = self.src_root_dir + \"/kubeflow/testing/py\"\n\n    self.tf_operator_root = os.path.join(self.src_root_dir,\n                                         \"kubeflow/tf-operator\")\n    self.tf_operator_py = os.path.join(self.tf_operator_root, \"py\")\n\n    self.go_path = self.test_dir\n\n    # Name for the Kubeflow app.\n    # This needs to be unique for each test run because it is\n    # used to name AWS resources\n    # TODO(jlewi): Might be good to include pull number or build id in the name\n    # Not sure if being non-deterministic is a good idea.\n    # A better approach might be to hash the workflow name to generate a unique\n    # name dependent on the workflow name. We know there will be one workflow\n    # per cluster.\n    self.uuid = uuid.uuid4().hex[0:8]\n\n    # Name for ephemeral EKS cluster\n    self.cluster_name = \"eks-cluster-\" + self.uuid\n\n    # Version for ephemeral EKS clsuter\n    self.eks_cluster_version = eks_cluster_version\n\n    # Config name is the name of the config file. This is used to give junit\n    # files unique names.\n    self.config_name = os.path.splitext(os.path.basename(config_path))[0]\n\n    # The class name to label junit files.\n    # We want to be able to group related tests in test grid.\n    # Test grid allows grouping by target which corresponds to the classname\n    # attribute in junit files.\n    # So we set an environment variable to the desired class name.\n    # The pytest modules can then look at this environment variable to\n    # explicitly override the classname.\n    # The classname should be unique for each run so it should take into\n    # account the different parameters\n    if test_target_name:\n      self.test_target_name = test_target_name\n    else:\n      self.test_target_name = self.config_name\n\n    # app_name is the name of the Kubeflow deployment.\n    # This needs to be unique per run since we name AWS resources with it.\n    self.app_name = self.cluster_name\n\n    # AWS service accounts can only be max 100 characters. Service account names\n    # are generated by taking the app_name and appending suffixes like \"user\"\n    # and \"admin\"\n    if len(self.app_name) > 99:\n      raise ValueError((\"app_name {0} is longer than 100 characters; this will\"\n                        \"likely exceed AWS naming restrictions.\").format(\n                          self.app_name))\n    # Directory for the KF app.\n    self.app_dir = os.path.join(self.test_dir, self.app_name)\n    self.use_basic_auth = use_basic_auth\n\n    # The name space we create KF artifacts in; e.g. TFJob and notebooks.\n    # TODO(jlewi): These should no longer be running the system namespace but\n    # should move into the namespace associated with the default profile.\n    self.steps_namespace = \"kubeflow\"\n\n    self.kfctl_path = os.path.join(self.src_dir, \"bin/kfctl\")\n\n    # Fetch the main repo from Prow environment.\n    self.main_repo = argo_build_util.get_repo_from_prow_env()\n\n    # extra_repos is a list of comma separated repo names with commits,\n    # in the format <repo_owner>/<repo_name>@<commit>,\n    # e.g. \"kubeflow/tf-operator@12345,kubeflow/manifests@23456\".\n    # This will be used to override the default repo branches.\n    self.extra_repos = []\n    if extra_repos:\n      self.extra_repos = extra_repos.split(',')\n\n\n  def _build_workflow(self):\n    \"\"\"Create the scaffolding for the Argo workflow\"\"\"\n    workflow = {\n      \"apiVersion\": \"argoproj.io/v1alpha1\",\n      \"kind\": \"Workflow\",\n      \"metadata\": {\n        \"name\": self.name,\n        \"namespace\": self.namespace,\n        \"labels\": argo_build_util.add_dicts([{\n            \"workflow\": self.name,\n            \"workflow_template\": TEMPLATE_LABEL,\n          }, argo_build_util.get_prow_labels()]),\n      },\n      \"spec\": {\n        \"entrypoint\": E2E_DAG_NAME,\n        # Have argo garbage collect old workflows otherwise we overload the API\n        # server.\n        \"ttlSecondsAfterFinished\": 7 * 24 * 60 * 60,\n        \"volumes\": [\n          {\n            \"name\": DATA_VOLUME,\n            \"persistentVolumeClaim\": {\n              \"claimName\": NFS_VOLUME_CLAIM,\n            },\n          },\n        ],\n        \"onExit\": EXIT_DAG_NAME,\n        \"templates\": [\n          {\n           \"dag\": {\n                \"tasks\": [],\n                },\n           \"name\": E2E_DAG_NAME,\n          },\n          {\n            \"dag\": {\n              \"tasks\": [],\n              },\n              \"name\": EXIT_DAG_NAME,\n            }\n        ],\n      },  # spec\n    } # workflow\n\n    return workflow\n\n  def _build_task_template(self):\n    \"\"\"Return a template for all the tasks\"\"\"\n\n    task_template = {'activeDeadlineSeconds': 3000,\n     'container': {'command': [],\n      'env': [\n        {\n          \"name\": \"AWS_ACCESS_KEY_ID\",\n          \"valueFrom\": {\n            \"secretKeyRef\": {\n              \"name\": \"aws-credentials\",\n              \"key\": \"AWS_ACCESS_KEY_ID\",\n            },\n          },\n        },\n        {\n          \"name\": \"AWS_SECRET_ACCESS_KEY\",\n          \"valueFrom\": {\n            \"secretKeyRef\": {\n              \"name\": \"aws-credentials\",\n              \"key\": \"AWS_SECRET_ACCESS_KEY\",\n            },\n          },\n        },\n        {\n          \"name\": \"AWS_DEFAULT_REGION\",\n          \"value\": \"us-west-2\",\n        },\n        {\n          \"name\": \"GITHUB_TOKEN\",\n          \"valueFrom\": {\n            \"secretKeyRef\": {\n              \"name\": \"github-token\",\n              \"key\": \"github_token\",\n            },\n          },\n        },\n        {\"name\": \"TEST_TARGET_NAME\",\n         \"value\": self.test_target_name},\n       ],\n      'image': 'public.ecr.aws/j1r0q0g6/kubeflow-testing:latest',\n      'imagePullPolicy': 'Always',\n      'name': '',\n      'resources': {'limits': {'cpu': '4', 'memory': '4Gi'},\n       'requests': {'cpu': '1', 'memory': '1536Mi'}},\n      'volumeMounts': [{'mountPath': '/mnt/test-data-volume',\n        'name': 'kubeflow-test-volume'}]},\n     'metadata': {'labels': {\n       'workflow_template': TEMPLATE_LABEL}},\n     'outputs': {}}\n\n    # Define common environment variables to be added to all steps\n    common_env = [\n      {'name': 'PYTHONPATH',\n       'value': \":\".join([self.kubeflow_testing_py,\n                          self.kfctl_py,\n                          self.tf_operator_py])},\n      {'name': 'GOPATH',\n        'value': self.go_path},\n    ]\n\n    task_template[\"container\"][\"env\"].extend(common_env)\n\n    task_template = argo_build_util.add_prow_env(task_template)\n\n    return task_template\n\n  def _build_step(self, name, workflow, dag_name, task_template,\n                  command, dependences):\n    \"\"\"Syntactic sugar to add a step to the workflow\"\"\"\n\n    step = argo_build_util.deep_copy(task_template)\n\n    step[\"name\"] = name\n    step[\"container\"][\"command\"] = command\n\n    return argo_build_util.add_task_to_dag(workflow, dag_name, step, dependences)\n\n  def _build_tests_dag(self, dependences):\n    \"\"\"Build the dag for the set of tests to run against a KF deployment.\"\"\"\n\n    task_template = self._build_task_template()\n    #*************************************************************************\n    # Test pytorch job\n    step_name = \"pytorch-job-deploy\"\n    command = [\"pytest\",\n               \"pytorch_job_deploy.py\",\n               \"-s\",\n               \"--timeout=600\",\n               \"--junitxml=\" + self.artifacts_dir + \"/junit_pytorch-test.xml\",\n               \"--kfctl_repo_path=\" + self.src_dir,\n               \"--namespace=\" + self.steps_namespace,\n               \"--cluster_name=\" + self.cluster_name,\n              ]\n\n    pytorch_test = self._build_step(step_name, self.workflow, E2E_DAG_NAME, task_template,\n                                    command, dependences)\n    pytorch_test[\"container\"][\"workingDir\"] = self.kfctl_pytest_dir\n\n    # ***************************************************************************\n    # kfam test\n    step_name = \"kfam-test\"\n    command = [\"pytest\",\n               \"kfam_test.py\",\n               \"-s\",\n               \"--timeout=600\",\n               \"--junitxml=\" + self.artifacts_dir + \"/junit_kfam-test.xml\",\n               \"--cluster_name=\" + self.cluster_name,\n               ]\n\n    kfam_test = self._build_step(step_name, self.workflow, E2E_DAG_NAME, task_template,\n                                     command, dependences)\n\n    kfam_test[\"container\"][\"workingDir\"] = self.kfctl_pytest_dir\n\n    test_dependences = [kfam_test[\"name\"], pytorch_test[\"name\"]]\n\n    return test_dependences\n\n\n  def _build_exit_dag(self):\n    \"\"\"Build the exit handler dag\"\"\"\n    task_template = self._build_task_template()\n\n    step_name = \"cluster-delete\"\n    command = [\n        \"pytest\",\n        \"kfctl_delete_cluster_test.py\",\n        \"-s\",\n        \"--log-cli-level=info\",\n        \"--timeout=1000\",\n        \"--junitxml=\" + self.artifacts_dir + \"/junit_kfctl-go-delete-test.xml\",\n        \"--cluster_deletion_script=\" + \"/usr/local/bin/delete-eks-cluster.sh\",\n        \"--cluster_name=\" + self.cluster_name,\n      ]\n\n    cluster_delete = self._build_step(step_name, self.workflow, EXIT_DAG_NAME,\n                                    task_template, command, [])\n    cluster_delete[\"container\"][\"workingDir\"] = self.kfctl_pytest_dir\n\n    step_name = \"copy-artifacts\"\n    command = [\"python\",\n               \"-m\",\n               \"kubeflow.testing.cloudprovider.aws.prow_artifacts\",\n               \"--artifacts_dir=\" +\n               self.output_dir,\n               \"copy_artifacts_to_s3\",\n               \"--bucket=\" + self.bucket,\n               ]\n\n    dependences = [cluster_delete[\"name\"]]\n    copy_artifacts = self._build_step(step_name, self.workflow, EXIT_DAG_NAME, task_template,\n                                      command, dependences)\n\n\n    step_name = \"test-dir-delete\"\n    command = [\"python\",\n               \"-m\",\n               \"kubeflow.kfctl.testing.util.run_with_retry\",\n               \"--retries=5\",\n               \"--\",\n               \"rm\",\n               \"-rf\",\n               self.test_dir,]\n    dependences = [copy_artifacts[\"name\"]]\n    copy_artifacts = self._build_step(step_name, self.workflow, EXIT_DAG_NAME, task_template,\n                                      command, dependences)\n\n    # We don't want to run from the directory we are trying to delete.\n    copy_artifacts[\"container\"][\"workingDir\"] = \"/\"\n\n\n  def build(self):\n    self.workflow = self._build_workflow()\n    task_template = self._build_task_template()\n    py3_template = argo_build_util.deep_copy(task_template)\n    py3_template[\"container\"][\"image\"] = \"public.ecr.aws/j1r0q0g6/kubeflow-testing:latest\"\n    default_namespace = \"kubeflow\"\n\n    #**************************************************************************\n    # Checkout\n    # create the checkout step\n\n    checkout = argo_build_util.deep_copy(task_template)\n\n    # Construct the list of repos to checkout\n    list_of_repos = DEFAULT_REPOS\n    list_of_repos.append(self.main_repo)\n    list_of_repos.extend(self.extra_repos)\n    repos = util.combine_repos(list_of_repos)\n    repos_str = ','.join(['%s@%s' % (key, value) for (key, value) in repos.items()])\n\n\n    # If we are using a specific branch (e.g. periodic tests for release branch)\n    # then we need to use depth = all; otherwise checkout out the branch\n    # will fail. Otherwise we checkout with depth=30. We want more than\n    # depth=1 because the depth will determine our ability to find the common\n    # ancestor which affects our ability to determine which files have changed\n    depth = 30\n    if os.getenv(\"BRANCH_NAME\"):\n      logging.info(\"BRANCH_NAME=%s; setting detph=all\",\n                   os.getenv(\"BRANCH_NAME\"))\n      depth = \"all\"\n\n    checkout[\"name\"] = \"checkout\"\n    checkout[\"container\"][\"command\"] = [\"/usr/local/bin/checkout_repos.sh\",\n                                        \"--repos=\" + repos_str,\n                                        \"--depth={0}\".format(depth),\n                                        \"--src_dir=\" + self.src_root_dir]\n\n    argo_build_util.add_task_to_dag(self.workflow, E2E_DAG_NAME, checkout, [])\n\n    # Change the working directory for all subsequent steps\n    task_template[\"container\"][\"workingDir\"] = os.path.join(\n      self.kfctl_pytest_dir)\n    py3_template[\"container\"][\"workingDir\"] = os.path.join(self.kfctl_pytest_dir)\n\n    #***************************************************************************\n    # create_pr_symlink\n    #***************************************************************************\n    # TODO(jlewi): run_e2e_workflow.py should probably create the PR symlink\n    step_name = \"create-pr-symlink\"\n    command = [\"python\",\n               \"-m\",\n               \"kubeflow.testing.cloudprovider.aws.prow_artifacts\",\n               \"--artifacts_dir=\" + self.output_dir,\n               \"create_pr_symlink_s3\",\n               \"--bucket=\" + self.bucket]\n\n    dependences = [checkout[\"name\"]]\n    symlink = self._build_step(step_name, self.workflow, E2E_DAG_NAME, task_template,\n                               command, dependences)\n\n    #**************************************************************************\n    # Run build_kfctl\n\n    step_name = \"kfctl-build-deploy\"\n    command = [\n        \"pytest\",\n        \"kfctl_go_test.py\",\n        # I think -s mean stdout/stderr will print out to aid in debugging.\n        # Failures still appear to be captured and stored in the junit file.\n        \"-s\",\n        \"--config_path=\" + self.config_path,\n        \"--values=\" + self.values_str,\n        # Increase the log level so that info level log statements show up.\n        # TODO(https://github.com/kubeflow/testing/issues/372): If we\n        # set a unique artifacts dir for each workflow with the proper\n        # prefix that should work.\n        \"--log-cli-level=info\",\n        \"--junitxml=\" + self.artifacts_dir + \"/junit_kfctl-build-test\"\n        + self.config_name + \".xml\",\n        # TODO(jlewi) Test suite name needs to be unique based on parameters.\n        \"-o\", \"junit_suite_name=test_kfctl_go_deploy_\" + self.config_name,\n        \"--kfctl_repo_path=\" + self.src_dir,\n    ]\n\n    dependences = [checkout[\"name\"]]\n    build_kfctl = self._build_step(step_name, self.workflow, E2E_DAG_NAME,\n                                   py3_template, command, dependences)\n\n    #**************************************************************************\n    # Create EKS cluster for E2E test\n    step_name = \"kfctl-create-cluster\"\n    command = [\n        \"pytest\",\n        \"kfctl_create_cluster_test.py\",\n        # I think -s mean stdout/stderr will print out to aid in debugging.\n        # Failures still appear to be captured and stored in the junit file.\n        \"-s\",\n        \"--cluster_name=\" + self.cluster_name,\n        \"--eks_cluster_version=\" + str(self.eks_cluster_version),\n        # Embedded Script in the ECR Image\n        \"--cluster_creation_script=\" + \"/usr/local/bin/create-eks-cluster.sh\",\n        \"--values=\" + self.values_str,\n        # Increase the log level so that info level log statements show up.\n        # TODO(https://github.com/kubeflow/testing/issues/372): If we\n        # set a unique artifacts dir for each workflow with the proper\n        # prefix that should work.\n        \"--log-cli-level=info\",\n        \"--junitxml=\" + self.artifacts_dir + \"/junit_kfctl-build-test\"\n        + self.config_name + \".xml\",\n        # TODO(jlewi) Test suite name needs to be unique based on parameters.\n        \"-o\", \"junit_suite_name=test_kfctl_go_deploy_\" + self.config_name,\n    ]\n\n    dependences = [checkout[\"name\"]]\n    create_cluster = self._build_step(step_name, self.workflow, E2E_DAG_NAME,\n                                   py3_template, command, dependences)\n\n    #**************************************************************************\n    # Deploy Kubeflow\n    step_name = \"kfctl-deploy-kubeflow\"\n    command = [\n        \"pytest\",\n        \"kfctl_deploy_kubeflow_test.py\",\n        # I think -s mean stdout/stderr will print out to aid in debugging.\n        # Failures still appear to be captured and stored in the junit file.\n        \"-s\",\n        \"--cluster_name=\" + self.cluster_name,\n        # Embedded Script in the ECR Image\n        \"--cluster_creation_script=\" + \"/usr/local/bin/create-eks-cluster.sh\",\n        \"--config_path=\" + self.config_path,\n        \"--values=\" + self.values_str,\n        \"--build_and_apply=\" + str(self.build_and_apply),\n        # Increase the log level so that info level log statements show up.\n        # TODO(https://github.com/kubeflow/testing/issues/372): If we\n        # set a unique artifacts dir for each workflow with the proper\n        # prefix that should work.\n        \"--log-cli-level=info\",\n        \"--junitxml=\" + self.artifacts_dir + \"/junit_kfctl-build-test\"\n        + self.config_name + \".xml\",\n        # TODO(jlewi) Test suite name needs to be unique based on parameters.\n        \"-o\", \"junit_suite_name=test_kfctl_go_deploy_\" + self.config_name,\n        \"--app_path=\" + self.app_dir,\n        \"--kfctl_repo_path=\" + self.src_dir,\n    ]\n\n    dependences = [build_kfctl[\"name\"], create_cluster[\"name\"], symlink[\"name\"]]\n    deploy_kf = self._build_step(step_name, self.workflow, E2E_DAG_NAME,\n                                   py3_template, command, dependences)\n\n\n    #**************************************************************************\n    # Wait for Kubeflow to be ready\n    step_name = \"kubeflow-is-ready\"\n    command = [\n           \"pytest\",\n           \"kf_is_ready_test.py\",\n           # I think -s mean stdout/stderr will print out to aid in debugging.\n           # Failures still appear to be captured and stored in the junit file.\n           \"-s\",\n           # TODO(jlewi): We should update kf_is_ready_test to take the config\n           # path and then based on the KfDef spec kf_is_ready_test should\n           # figure out what to do.\n           \"--use_basic_auth={0}\".format(self.use_basic_auth),\n           # Increase the log level so that info level log statements show up.\n           \"--log-cli-level=info\",\n           \"--junitxml=\" + os.path.join(self.artifacts_dir,\n                                        \"junit_kfctl-is-ready-test-\" +\n                                        self.config_name + \".xml\"),\n           # Test suite name needs to be unique based on parameters\n           \"-o\", \"junit_suite_name=test_kf_is_ready_\" + self.config_name,\n           \"--app_path=\" + self.app_dir,\n           \"--cluster_name=\" + self.cluster_name,\n           \"--namespace=\" + default_namespace,\n         ]\n\n    dependences = [deploy_kf[\"name\"]]\n    kf_is_ready = self._build_step(step_name, self.workflow, E2E_DAG_NAME, task_template,\n                                   command, dependences)\n\n    #**************************************************************************\n    # Run functional tests\n    dependences = [kf_is_ready[\"name\"]]\n    dependences = self._build_tests_dag(dependences=dependences)\n\n    #***********************************************************************\n    # Delete Kubeflow\n    # Putting Delete Kubeflow here is deletion functionality should be tested out of exit DAG\n    step_name = \"kfctl-delete-wrong-host\"\n    command = [\n        \"pytest\",\n        \"kfctl_delete_wrong_cluster.py\",\n        \"-s\",\n        \"--log-cli-level=info\",\n        \"--timeout=1000\",\n        \"--junitxml=\" + self.artifacts_dir + \"/junit_kfctl-go-delete-wrong-cluster-test.xml\",\n        \"--app_path=\" + self.app_dir,\n        \"--kfctl_path=\" + self.kfctl_path,\n        \"--cluster_name=\" + self.cluster_name,\n      ]\n\n    kfctl_delete_wrong_cluster = self._build_step(step_name, self.workflow, E2E_DAG_NAME,\n                                                  task_template,\n                                                  command, dependences)\n    kfctl_delete_wrong_cluster[\"container\"][\"workingDir\"] = self.kfctl_pytest_dir\n\n    step_name = \"kfctl-delete\"\n    command = [\n        \"pytest\",\n        \"kfctl_delete_test.py\",\n        \"-s\",\n        \"--log-cli-level=info\",\n        \"--timeout=1000\",\n        \"--junitxml=\" + self.artifacts_dir + \"/junit_kfctl-go-delete-test.xml\",\n        \"--app_path=\" + self.app_dir,\n        \"--kfctl_path=\" + self.kfctl_path,\n        \"--cluster_name=\" + self.cluster_name,\n      ]\n\n    kfctl_delete = self._build_step(step_name, self.workflow, E2E_DAG_NAME,\n                                    task_template,\n                                    command, [\"kfctl-delete-wrong-host\"])\n    kfctl_delete[\"container\"][\"workingDir\"] = self.kfctl_pytest_dir\n\n    #***************************************************************************\n    # Exit DAG\n    #***************************************************************************\n    self._build_exit_dag()\n\n\n    # Set the labels on all templates\n    self.workflow = argo_build_util.set_task_template_labels(self.workflow)\n\n    return self.workflow\n\n\n# TODO(jlewi): This is an unnecessary layer of indirection around the builder\n# We should allow py_func in prow_config to point to the builder and\n# let e2e_tool take care of this.\ndef create_workflow(**kwargs): # pylint: disable=too-many-statements\n  \"\"\"Create workflow returns an Argo workflow to test kfctl upgrades.\n  Args:\n    name: Name to give to the workflow. This can also be used to name things\n     associated with the workflow.\n  \"\"\"\n\n  builder = Builder(**kwargs)\n\n  return builder.build()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/ci/kfctl_go_build_test.py",
    "content": "import logging\nimport os\n\nimport pytest\nfrom kubeflow.testing import util\nimport kfctl_go_test_utils as kfctl_util\n\ndef test_build_kfctl_go(record_xml_attribute):\n  \"\"\"Test building of kfctl go.\n\n  \"\"\"\n  util.set_pytest_junit(record_xml_attribute, \"test_build_kfctl_go\")\n\n  # Need to activate account for scopes.\n  if os.getenv(\"GOOGLE_APPLICATION_CREDENTIALS\"):\n    util.run([\n      \"gcloud\", \"auth\", \"activate-service-account\",\n      \"--key-file=\" + os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]\n    ])\n\n  kfctl_path = kfctl_util.build_kfctl_go()\n  logging.info(\"kfctl go binary path %s\", kfctl_path)\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(\n    level=logging.INFO,\n    format=('%(levelname)s|%(asctime)s'\n        '|%(pathname)s|%(lineno)d| %(message)s'),\n    datefmt='%Y-%m-%dT%H:%M:%S',\n  )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/ci/kfctl_go_deploy_test.py",
    "content": "import logging\nimport os\n\nimport pytest\n\nimport kfctl_go_test_utils as kfctl_util\nfrom kubeflow.testing import util\n\ndef test_deploy_kfctl_go(record_xml_attribute, app_path, project,\n                         use_basic_auth, use_istio, config_path, kfctl_path):\n  \"\"\"Test deploying Kubeflow.\n\n  Args:\n    app_path: The path to the Kubeflow app.\n    project: The GCP project to use.\n  \"\"\"\n  util.set_pytest_junit(record_xml_attribute, \"test_deploy_kfctl_go\")\n\n  # Need to activate account for scopes.\n  if os.getenv(\"GOOGLE_APPLICATION_CREDENTIALS\"):\n    util.run([\n      \"gcloud\", \"auth\", \"activate-service-account\",\n      \"--key-file=\" + os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]\n    ])\n\n  kfctl_util.kfctl_deploy_kubeflow(app_path, project, use_basic_auth,\n              use_istio, config_path, kfctl_path)\n\n  kfctl_util.verify_kubeconfig(app_path)\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(\n    level=logging.INFO,\n    format=('%(levelname)s|%(asctime)s'\n        '|%(pathname)s|%(lineno)d| %(message)s'),\n    datefmt='%Y-%m-%dT%H:%M:%S',\n  )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/ci/kfctl_upgrade_e2e_workflow.py",
    "content": "\"\"\"\"Define the E2E workflow for kfctl.\nRapid iteration.\nHere are some pointers for rapidly iterating on the workflow during development.\n1. You can use the e2e_tool.py to directly launch the workflow on a K8s cluster.\n   If you don't have CLI access to the kubeflow-ci cluster (most folks) then\n   you would need to setup your own test cluster.\n2. To avoid redeploying on successive runs set the following parameters\n   --app_name=name for kfapp\n   --delete_kubeflow=False\n   Setting these parameters will cause the same KF deployment to be reused\n   across invocations. As a result successive runs won't have to redeploy KF.\nExample running with E2E tool\nexport PYTHONPATH=${PYTHONPATH}:${KUBEFLOW_REPO}/py:${KUBEFLOW_TESTING_REPO}/py\npython -m kubeflow.testing.e2e_tool apply \\\n  kubeflow.kubeflow.ci.kfctl_e2e_workflow.create_workflow\n  --name=${USER}-kfctl-test-$(date +%Y%m%d-%H%M%S) \\\n  --namespace=kubeflow-test-infra \\\n  --test-endpoint=true \\\n  --kf-app-name=${KFAPPNAME} \\\n  --delete-kf=false\n  --open-in-chrome=true\nWe set kf-app-name and delete-kf to false to allow reusing the deployment\nacross successive runs.\nTo use code from a pull request set the prow envariables; e.g.\nexport JOB_NAME=\"jlewi-test\"\nexport JOB_TYPE=\"presubmit\"\nexport BUILD_ID=1234\nexport PROW_JOB_ID=1234\nexport REPO_OWNER=kubeflow\nexport REPO_NAME=kubeflow\nexport PULL_NUMBER=4148\n\"\"\"\n\nimport datetime\nfrom kubeflow.kfctl.testing.ci import kfctl_e2e_workflow\nfrom kubeflow.testing import argo_build_util\nimport logging\nimport os\nimport uuid\n\nUPGRADE_DAG_NAME = \"upgrade-dag\"\n\nREADY_AFTER_UPGRADE = \"ready-after-upgrade\"\n\nTEMPLATE_LABEL = \"kfctl_upgrade_e2e\"\n\nclass Builder(kfctl_e2e_workflow.Builder):\n    def __init__(self,\n                 upgrade_spec_path=(\"https://raw.githubusercontent.com/kubeflow\"\n                                    \"/manifests/v0.7-branch/kfdef/kfctl_upgrade_gcp_iap_0.7.1.yaml\"),\n                 **kwargs):\n        \"\"\"Initialize a builder.\"\"\"\n        super(Builder, self).__init__(**kwargs)\n        self.upgrade_spec_path = upgrade_spec_path\n\n    def _build_upgrade_dag(self):\n        \"\"\"Build the dag of steps to run upgrade.\"\"\"\n\n        # Add the dag to the workflow.\n        self.workflow[\"spec\"][\"templates\"].append({\n           \"dag\": {\n                \"tasks\": [],\n                },\n           \"name\": UPGRADE_DAG_NAME,\n          })\n        task_template = self._build_task_template()\n\n        # Change the workfing directory for all subsequent steps\n        task_template[\"container\"][\"workingDir\"] = os.path.join(self.kfctl_pytest_dir)\n\n        #***************************************************************************\n        # Run kfctl upgrade\n        step_name = \"upgrade\"\n        command = [\n           \"pytest\",\n           \"kfctl_upgrade_test.py\",\n           \"-s\",\n           \"--log-cli-level=info\",\n           \"--junitxml=\" + os.path.join(self.artifacts_dir,\n                                        \"junit_kfctl-upgrade-test-\" +\n                                        self.config_name + \".xml\"),\n           # Test suite name needs to be unique based on parameters\n           \"-o\", \"junit_suite_name=test_kfctl_upgrade_\" + self.config_name,\n           \"--app_path=\" + self.app_dir,\n           \"--kfctl_path=\" + self.kfctl_path,\n           \"--upgrade_spec_path=\" + self.upgrade_spec_path,\n         ]\n        dependences = []\n        upgrade_step = self._build_step(step_name, self.workflow, UPGRADE_DAG_NAME, task_template,\n                                        command, dependences)\n    def build(self):\n        self.workflow = super(Builder, self).build()\n        task_template = self._build_task_template()\n\n        # Change the workflow_template labels\n        self.workflow[\"metadata\"][\"labels\"][\"workflow_template\"] = TEMPLATE_LABEL\n\n        # Add the dag to upgrade Kubeflow to the workflow\n        self._build_upgrade_dag()\n\n        # Add a task to the E2E dag to run the dag to upgrade Kubeflow.\n        dependencies = [self._run_tests_step_name]\n\n        if self._test_endpoint_step_name:\n            dependencies.append(self._test_endpoint_step_name)\n\n        step_name = UPGRADE_DAG_NAME\n        template_name = UPGRADE_DAG_NAME\n        argo_build_util.add_task_only_to_dag(self.workflow, kfctl_e2e_workflow.E2E_DAG_NAME, step_name,\n                                             template_name, dependencies)\n\n        # Wait for Kubeflow to be ready after upgrading\n        step_name = READY_AFTER_UPGRADE\n        template_name = \"kubeflow-is-ready\"\n        command = [\n           \"pytest\",\n           \"kf_is_ready_test.py\",\n           \"-s\",\n           \"--log-cli-level=info\",\n           \"--junitxml=\" + os.path.join(self.artifacts_dir,\n                                        \"junit_ready-after-upgrade-test-\" +\n                                        self.config_name + \".xml\"),\n           \"-o\", \"junit_suite_name=test_ready_after_upgrade_\" + self.config_name,\n           \"--app_path=\" + self.app_dir,\n         ]\n\n        dependencies = [UPGRADE_DAG_NAME]\n        argo_build_util.add_task_only_to_dag(self.workflow, kfctl_e2e_workflow.E2E_DAG_NAME, step_name,\n                                             template_name, dependencies)\n   \n        #****************************************************************************\n        # Add tests DAG\n        #****************************************************************************\n        # After running upgrade we want to rerun the DAG(s) that validate the deployment is healthy\n\n        step_name = \"test-after-upgrade\"\n        template_name = kfctl_e2e_workflow.TESTS_DAG_NAME\n        dependencies = [READY_AFTER_UPGRADE]\n        argo_build_util.add_task_only_to_dag(self.workflow, kfctl_e2e_workflow.E2E_DAG_NAME, step_name,\n                                             template_name, dependencies)\n\n        # Test the endpoint after upgrade\n        if self.test_endpoint:\n            dependencies = [UPGRADE_DAG_NAME]\n            step_name = \"upgraded-endpoint-ready\"\n            argo_build_util.add_task_only_to_dag(self.workflow, kfctl_e2e_workflow.E2E_DAG_NAME, step_name,\n                                                 self._test_endpoint_template_name, dependencies)\n\n        # Reset the labels on all templates to pick up the updated workflow template label\n        self.workflow = argo_build_util.set_task_template_labels(self.workflow)\n\n        return self.workflow\n\n# TODO(jlewi): This is an unnecessary layer of indirection around the builder\n# We should allow py_func in prow_config to point to the builder and\n# let e2e_tool take care of this.\ndef create_workflow(**kwargs): # pylint: disable=too-many-statements\n    \"\"\"Create workflow returns an Argo workflow to test kfctl upgrades.\n    Args:\n      name: Name to give to the workflow. This can also be used to name things\n       associated with the workflow.\n    \"\"\"\n\n    builder = Builder(**kwargs)\n\n    return builder.build()\n\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/ci/update_jupyter_web_app.py",
    "content": "\"\"\"Script to build and update the Jupyter WebApp image.\n\nRequires python3\n\nhub CLI depends on an OAuth token with repo permissions:\nhttps://hub.github.com/hub.1.html\n  * It will look for environment variable GITHUB_TOKEN\n\"\"\"\n\nimport logging\nimport os\nimport tempfile\nimport yaml\n\nimport fire\nimport git\nimport httplib2\n\nfrom kubeflow.kfctl.testing.util import application_util\nfrom kubeflow.testing import util # pylint: disable=no-name-in-module\n\nfrom containerregistry.client import docker_creds\nfrom containerregistry.client import docker_name\nfrom containerregistry.client.v2_2 import docker_http\nfrom containerregistry.client.v2_2 import docker_image as v2_2_image\nfrom containerregistry.transport import transport_pool\n\n# The image name as defined in the kustomization file\nJUPYTER_WEB_APP_IMAGE_NAME = \"gcr.io/kubeflow-images-public/jupyter-web-app\"\n\nclass WebAppUpdater(object): # pylint: disable=useless-object-inheritance\n  def __init__(self):\n    self._last_commit = None\n    self.manifests_repo_dir = None\n\n  def build_image(self, build_project, registry_project):\n    \"\"\"Build the image.\n\n    Args:\n      build_project: GCP project used to build the image.\n      registry_project: GCP project used to host the image.\n    \"\"\"\n    env = dict()\n    env.update(os.environ)\n    env[\"PROJECT\"] = build_project\n    env[\"REGISTRY_PROJECT\"] = registry_project\n    env[\"GIT_TAG\"] = self._last_commit\n\n    with tempfile.NamedTemporaryFile() as hf:\n      name = hf.name\n    env[\"OUTPUT\"] = name\n    web_dir = self._component_dir()\n    util.run([\"make\", \"build-gcb\"], env=env, cwd=web_dir)\n\n    # TODO(jlewi): We want to get the actual image produced by GCB. Right\n    # now this is a bit brittle because we have multiple layers of substitution\n    # e.g. in the Makefile and then the GCB YAML.\n    # It might be better to parse the stdout of make-build-gcb to get the\n    # GCB job name and then fetch the GCB info specifying the images.\n    with open(name) as hf:\n      data = yaml.load(hf)\n\n    return data[\"image\"]\n\n  @property\n  def last_commit(self):\n    \"\"\"Get the last commit of a change to the source for the jupyter-web-app.\"\"\"\n    if not self._last_commit:\n      # Get the hash of the last commit to modify the source for the Jupyter web\n      # app image\n      self._last_commit = util.run([\"git\", \"log\", \"-n\", \"1\",\n                                    \"--pretty=format:\\\"%h\\\"\",\n                                    \"components/jupyter-web-app\"],\n                                   cwd=self._root_dir()).strip(\"\\\"\")\n\n    return self._last_commit\n\n  def _find_remote_repo(self, repo, remote_url): # pylint: disable=no-self-use\n    \"\"\"Find the remote repo if it has already been added.\n\n    Args:\n      repo: The git python repo object.\n      remote_url: The URL of the remote repo e.g.\n        git@github.com:jlewi/kubeflow.git\n\n    Returns:\n      remote: git-python object representing the remote repo or none if it\n        isn't present.\n    \"\"\"\n    for r in repo.remotes:\n      for u in r.urls:\n        if remote_url == u:\n          return r\n\n    return None\n\n  def all(self, build_project, registry_project, remote_fork, # pylint: disable=too-many-statements,too-many-branches\n          kustomize_file, add_github_host=False):\n    \"\"\"Build the latest image and update the prototype.\n\n    Args:\n      build_project: GCP project used to build the image.\n      registry_project: GCP project used to host the image.\n      remote_fork: Url of the remote fork.\n        The remote fork used to create the PR;\n         e.g. git@github.com:jlewi/kubeflow.git. currently only ssh is\n         supported.\n      kustomize_file: Path to the kustomize file\n      add_github_host: If true will add the github ssh host to known ssh hosts.\n    \"\"\"\n    # TODO(jlewi): How can we automatically determine the root of the git\n    # repo containing the kustomize_file?\n    self.manifests_repo_dir = util.run([\"git\", \"rev-parse\", \"--show-toplevel\"],\n                                       cwd=os.path.dirname(kustomize_file))\n    repo = git.Repo(self.manifests_repo_dir)\n    util.maybe_activate_service_account()\n    last_commit = self.last_commit\n\n    # Ensure github.com is in the known hosts\n    if add_github_host:\n      output = util.run([\"ssh-keyscan\", \"github.com\"])\n      with open(os.path.join(os.getenv(\"HOME\"), \".ssh\", \"known_hosts\"),\n                mode='a') as hf:\n        hf.write(output)\n\n    if not remote_fork.startswith(\"git@github.com\"):\n      raise ValueError(\"Remote fork currently only supports ssh\")\n\n    remote_repo = self._find_remote_repo(repo, remote_fork)\n\n    if not remote_repo:\n      fork_name = remote_fork.split(\":\", 1)[-1].split(\"/\", 1)[0]\n      logging.info(\"Adding remote %s=%s\", fork_name, remote_fork)\n      remote_repo = repo.create_remote(fork_name, remote_fork)\n\n    logging.info(\"Last change to components-jupyter-web-app was %s\", last_commit)\n\n    base = \"gcr.io/{0}/jupyter-web-app\".format(registry_project)\n\n    # Check if there is already an image tagged with this commit.\n    image = base + \":\" + self.last_commit\n    transport = transport_pool.Http(httplib2.Http)\n    src = docker_name.from_string(image)\n    creds = docker_creds.DefaultKeychain.Resolve(src)\n\n    image_exists = False\n    try:\n      with v2_2_image.FromRegistry(src, creds, transport) as src_image:\n        logging.info(\"Image %s exists; digest: %s\", image,\n                     src_image.digest())\n        image_exists = True\n    except docker_http.V2DiagnosticException as e:\n      if e.status == 404:\n        logging.info(\"%s doesn't exist\", image)\n      else:\n        raise\n\n    if not image_exists:\n      logging.info(\"Building the image\")\n      image = self.build_image(build_project, registry_project)\n      logging.info(\"Created image: %s\", image)\n    else:\n      logging.info(\"Image %s already exists\", image)\n\n    # TODO(jlewi): What if the file was already modified so we didn't\n    # modify it in this run but we still need to commit it?\n    image_updated = application_util.set_kustomize_image(\n      kustomize_file, JUPYTER_WEB_APP_IMAGE_NAME, image)\n\n    if not image_updated:\n      logging.info(\"kustomization not updated so not creating a PR.\")\n      return\n\n    application_util.regenerate_manifest_tests(self.manifests_repo_dir)\n\n    branch_name = \"update_jupyter_{0}\".format(last_commit)\n\n    if repo.active_branch.name != branch_name:\n      logging.info(\"Creating branch %s\", branch_name)\n\n      branch_names = [b.name for b in repo.branches]\n      if branch_name in branch_names:\n        logging.info(\"Branch %s exists\", branch_name)\n        util.run([\"git\", \"checkout\", branch_name], cwd=self.manifests_repo_dir)\n      else:\n        util.run([\"git\", \"checkout\", \"-b\", branch_name],\n                 cwd=self.manifests_repo_dir)\n\n    if self._check_if_pr_exists(commit=last_commit):\n      # Since a PR already exists updating to the specified commit\n      # don't create a new one.\n      # We don't want to just push -f because if the PR already exists\n      # git push -f will retrigger the tests.\n      # To force a recreate of the PR someone could close the existing\n      # PR and a new PR will be created on the next cron run.\n      return\n\n    logging.info(\"Add file %s to repo\", kustomize_file)\n    repo.index.add([kustomize_file])\n    repo.index.add([os.path.join(self.manifests_repo_dir, \"tests/*\")])\n    repo.index.commit(\"Update the jupyter web app image to {0}\".format(image))\n\n    util.run([\"git\", \"push\", \"-f\", remote_repo.name,\n              \"{0}:{0}\".format(branch_name)],\n             cwd=self.manifests_repo_dir)\n\n    self.create_pull_request(commit=last_commit)\n\n  def _pr_title(self, commit):\n    pr_title = \"[auto PR] Update the jupyter-web-app image to {0}\".format(\n      commit)\n    return pr_title\n\n  def _check_if_pr_exists(self, commit=None):\n    \"\"\"Check if a PR is already open.\n\n    Returns:\n      exists: True if a PR updating the image to the specified commit already\n       exists and false otherwise.\n    \"\"\"\n    # TODO(jlewi): Modeled on\n    # https://github.com/kubeflow/examples/blob/master/code_search/docker/ks/update_index.sh\n    # TODO(jlewi): We should use the GitHub API and check if there is an\n    # existing open pull request. Or potentially just use the hub CLI.\n\n    if not commit:\n      commit = self.last_commit\n      logging.info(\"No commit specified defaulting to %s\", commit)\n\n    pr_title = self._pr_title(commit)\n\n    # See hub conventions:\n    # https://hub.github.com/hub.1.html\n    # The GitHub repository is determined automatically based on the name\n    # of remote repositories\n    output = util.run([\"hub\", \"pr\", \"list\", \"--format=%U;%t\\n\"],\n                      cwd=self.manifests_repo_dir)\n\n\n    lines = output.splitlines()\n\n    prs = {}\n    for l in lines:\n      n, t = l.split(\";\", 1)\n      prs[t] = n\n\n    if pr_title in prs:\n      logging.info(\"PR %s already exists to update the Jupyter web app image \"\n                   \"to %s\", prs[pr_title], commit)\n      return True\n\n    return False\n\n  def create_pull_request(self, base=\"kubeflow:master\", commit=None):\n    \"\"\"Create a pull request.\n\n    Args:\n      base: The base to use. Defaults to \"kubeflow:master\". This should be\n        in the form <GitHub OWNER>:<branch>\n    \"\"\"\n    pr_title = self._pr_title(commit)\n\n    with tempfile.NamedTemporaryFile(delete=False, mode=\"w\") as hf:\n      hf.write(pr_title)\n      hf.write(\"\\n\")\n      hf.write(\"\\n\")\n      hf.write(\n        \"Image built from commit https://github.com/kubeflow/kubeflow/\"\n        \"commit/{0}\".format(self._last_commit))\n      message_file = hf.name\n\n    # TODO(jlewi): -f creates the pull requests even if there are local changes\n    # this was useful during development but we may want to drop it.\n    util.run([\"hub\", \"pull-request\", \"-f\", \"--base=\" + base, \"-F\",\n              message_file],\n              cwd=self.manifests_repo_dir)\n\n  def _root_dir(self):\n    this_dir = os.path.dirname(__file__)\n    return os.path.abspath(os.path.join(this_dir, \"..\", \"..\", \"..\", \"..\"))\n\n  def _component_dir(self):\n    return os.path.join(self._root_dir(), \"components\", \"jupyter-web-app\")\n\nif __name__ == '__main__':\n  logging.basicConfig(level=logging.INFO,\n                      format=('%(levelname)s|%(asctime)s'\n                              '|%(pathname)s|%(lineno)d| %(message)s'),\n                      datefmt='%Y-%m-%dT%H:%M:%S',\n                      )\n  logging.getLogger().setLevel(logging.INFO)\n  fire.Fire(WebAppUpdater)\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/conftest.py",
    "content": "import pytest\n\ndef pytest_addoption(parser):\n  parser.addoption(\n      \"--app_path\", action=\"store\", default=\"\",\n      help=\"Path where the KF application should be stored\")\n\n  parser.addoption(\n      \"--app_name\", action=\"store\", default=\"\",\n      help=\"Name of the KF application\")\n\n  parser.addoption(\n      \"--cluster_name\", action=\"store\", default=\"\",\n      help=\"Name of ephemeral EKS cluster for e2e test.\")\n\n  parser.addoption(\n      \"--kfctl_path\", action=\"store\", default=\"\",\n      help=\"Path to kfctl.\")\n\n  parser.addoption(\n      \"--kfctl_repo_path\", action=\"store\", default=\"\",\n      help=\"Path to kfctl repo.\")\n\n  parser.addoption(\n      \"--namespace\", action=\"store\", default=\"kubeflow\",\n      help=\"Namespace to use.\")\n\n  parser.addoption(\n      \"--project\", action=\"store\", default=\"kubeflow-ci-deployment\",\n      help=\"GCP project to deploy Kubeflow to\")\n\n  parser.addoption(\n      \"--config_path\", action=\"store\", default=\"\",\n      help=(\"The config to use for kfctl init. The path can use python style \"\n            \"go format strings; e.g. \"\n            \"--config_path=/{srcdir}/kubeflow/manifests/kfdef/kfctl_gcp.yaml\"\n            \" The values should be supplied by --values.\"))\n\n  parser.addoption(\n      \"--values\", action=\"store\", default=\"\",\n      help=(\"A comma separated list of key value pairs to be used for \"\n            \"subsitution in --config_path\"))\n\n  parser.addoption(\n      \"--build_and_apply\", action=\"store\", default=\"False\",\n      help=\"Whether to build and apply or apply in kfctl\"\n  )\n  # TODO(jlewi): This flag is deprecated this should be determined now from the KFDef spec.\n  parser.addoption(\n      \"--use_basic_auth\", action=\"store\", default=\"False\",\n      help=\"Use basic auth.\")\n\n  # TODO(jlewi): This flag is deprecated this should be determined now from the KFDef spec\n  parser.addoption(\n      \"--use_istio\", action=\"store\", default=\"True\",\n      help=\"Use istio.\")\n\n  parser.addoption(\n      \"--eks_cluster_version\", action=\"store\", default=\"\",\n      help=\"Version of ephemeral EKS cluster\")\n\n  parser.addoption(\n      \"--cluster_creation_script\", action=\"store\", default=\"\",\n      help=\"The script to use to create a K8s cluster before running kfctl.\")\n\n  parser.addoption(\n      \"--cluster_deletion_script\", action=\"store\", default=\"\",\n      help=\"The script to use to delete a K8s cluster before running kfctl.\")\n\n  parser.addoption(\n      \"--self_signed_cert\", action=\"store\", default=\"False\",\n      help=\"Whether to use self-signed cert for ingress.\")\n\n  parser.addoption(\n      \"--upgrade_spec_path\", action=\"store\", default=\"\",\n      help=(\"The spec for upgrading Kubeflow. The path can use python style \"\n            \"go format strings; e.g. \"\n            \"--upgrade_spec_path=/{srcdir}/kubeflow/manifests/kfdef/kfctl_gcp_upgrade.yaml\"))\n\n@pytest.fixture\ndef app_path(request):\n  return request.config.getoption(\"--app_path\")\n\n@pytest.fixture\ndef app_name(request):\n  return request.config.getoption(\"--app_name\")\n\n@pytest.fixture\ndef kfctl_path(request):\n  return request.config.getoption(\"--kfctl_path\")\n\n@pytest.fixture\ndef kfctl_repo_path(request):\n  return request.config.getoption(\"--kfctl_repo_path\")\n\n@pytest.fixture\ndef namespace(request):\n  return request.config.getoption(\"--namespace\")\n\n@pytest.fixture\ndef project(request):\n  return request.config.getoption(\"--project\")\n\n@pytest.fixture\ndef config_path(request):\n  return request.config.getoption(\"--config_path\")\n\n@pytest.fixture\ndef values(request):\n  return request.config.getoption(\"--values\")\n\n@pytest.fixture\ndef eks_cluster_version(request):\n  return request.config.getoption(\"--eks_cluster_version\")\n\n@pytest.fixture\ndef cluster_creation_script(request):\n  return request.config.getoption(\"--cluster_creation_script\")\n\n@pytest.fixture\ndef cluster_deletion_script(request):\n  return request.config.getoption(\"--cluster_deletion_script\")\n\n@pytest.fixture\ndef cluster_name(request):\n  return request.config.getoption(\"--cluster_name\")\n\n@pytest.fixture\ndef build_and_apply(request):\n  value = request.config.getoption(\"--build_and_apply\").lower()\n\n  if value in [\"t\", \"true\"]:\n    return True\n  else:\n    return False\n\n\n@pytest.fixture\ndef use_basic_auth(request):\n  value = request.config.getoption(\"--use_basic_auth\").lower()\n\n  if value in [\"t\", \"true\"]:\n    return True\n  else:\n    return False\n\n@pytest.fixture\ndef use_istio(request):\n  value = request.config.getoption(\"--use_istio\").lower()\n\n  if value in [\"t\", \"true\"]:\n    return True\n  else:\n    return False\n\n@pytest.fixture\ndef self_signed_cert(request):\n  value = request.config.getoption(\"--self_signed_cert\").lower()\n  if value in [\"t\", \"true\"]:\n    return True\n  else:\n    return False\n\n@pytest.fixture\ndef upgrade_spec_path(request):\n  return request.config.getoption(\"--upgrade_spec_path\")"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/endpoint_ready_test.py",
    "content": "import json\nimport logging\nimport os\n\nimport pytest\n\nfrom kubeflow.testing import util\nfrom kubeflow.kfctl.testing.util import gcp_util\n\n# There's really no good reason to run test_endpoint during presubmits.\n# We shouldn't need it to feel confident that kfctl is working.\n@pytest.mark.skipif(os.getenv(\"JOB_TYPE\") == \"presubmit\",\n                    reason=\"test endpoint doesn't run in presubmits\")\ndef test_endpoint_is_ready(record_xml_attribute, project, app_path, app_name, use_basic_auth):\n  \"\"\"Test that Kubeflow was successfully deployed.\n\n  Args:\n    project: The gcp project that we deployed kubeflow\n    app_name: The name of the kubeflow deployment\n  \"\"\"\n  util.set_pytest_junit(record_xml_attribute, \"test_endpoint_is_ready\")\n\n  url = \"https://{}.endpoints.{}.cloud.goog\".format(app_name, project)\n  if use_basic_auth:\n    with open(os.path.join(app_path, \"login.json\"), \"r\") as f:\n      login = json.load(f)\n      # Let it fail if login info cannot be found.\n      username = login[\"username\"]\n      password = login[\"password\"]\n    if not gcp_util.basic_auth_is_ready(url, username, password):\n      raise Exception(\"Basic auth endpoint is not ready\")\n  else:\n    # Owned by project kubeflow-ci-deployment.\n    os.environ[\"CLIENT_ID\"] = \"29647740582-7meo6c7a9a76jvg54j0g2lv8lrsb4l8g.apps.googleusercontent.com\"\n    if not gcp_util.iap_is_ready(url):\n      raise Exception(\"IAP endpoint is not ready\")\n\nif __name__ == \"__main__\":\n  logging.basicConfig(level=logging.INFO,\n                      format=('%(levelname)s|%(asctime)s'\n                              '|%(pathname)s|%(lineno)d| %(message)s'),\n                      datefmt='%Y-%m-%dT%H:%M:%S',\n                      )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/jupyter_test.py",
    "content": "\"\"\"Test jupyter custom resource.\nThis file tests that we can create notebooks using the Jupyter custom resource.\nIt is an integration test as it depends on having access to\na Kubeflow cluster with the custom resource test installed.\nWe use the pytest framework because\n  1. It can output results in junit format for prow/gubernator\n  2. It has good support for configuring tests using command line arguments\n    (https://docs.pytest.org/en/latest/example/simple.html)\nPython Path Requirements:\n  kubeflow/testing/py - https://github.com/kubeflow/testing/tree/master/py\n    * Provides utilities for testing\nManually running the test\n  1. Configure your KUBECONFIG file to point to the desired cluster\n\"\"\"\n\nimport logging\nimport os\n\nimport pytest\n\nfrom kubernetes import client as k8s_client\nfrom kubeflow.testing import util\nfrom kubeflow.kfctl.testing.util import aws_util as kfctl_aws_util\n\n\ndef test_jupyter(record_xml_attribute, kfctl_repo_path, namespace, cluster_name):\n  \"\"\"Test the jupyter notebook.\n  Args:\n    record_xml_attribute: Test fixture provided by pytest.\n    kfctl_repo_path: path to local kfctl repository.\n    namespace: namespace to run in.\n  \"\"\"\n  kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n  logging.info(\"using kfctl repo: %s\" % kfctl_repo_path)\n  util.run([\"kubectl\", \"apply\", \"-f\",\n            os.path.join(kfctl_repo_path,\n                         \"py/kubeflow/kfctl/testing/pytests/testdata/jupyter_test.yaml\")])\n  api_client = k8s_client.ApiClient()\n  api = k8s_client.CoreV1Api(api_client)\n\n  resp = api.list_namespaced_service(namespace)\n  names = [service.metadata.name for service in resp.items]\n  if not \"jupyter-test\" in names:\n    raise ValueError(\"not able to find jupyter-test service.\")\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(\n      level=logging.INFO,\n      format=('%(levelname)s|%(asctime)s'\n              '|%(pathname)s|%(lineno)d| %(message)s'),\n      datefmt='%Y-%m-%dT%H:%M:%S',\n  )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kf_is_ready_test.py",
    "content": "import logging\nimport os\nimport yaml\n\nimport pytest\n\nfrom kubeflow.testing import util\nfrom kubeflow.kfctl.testing.util import deploy_utils\nfrom kubeflow.kfctl.testing.util import aws_util as kfctl_aws_util\n\n\ndef set_logging():\n    logging.basicConfig(level=logging.INFO,\n                        format=('%(levelname)s|%(asctime)s'\n                                '|%(pathname)s|%(lineno)d| %(message)s'),\n                        datefmt='%Y-%m-%dT%H:%M:%S',\n                        )\n    logging.getLogger().setLevel(logging.INFO)\n\n\ndef get_platform_app_name(app_path):\n    with open(os.path.join(app_path, \"tmp.yaml\")) as f:\n        kfdef = yaml.safe_load(f)\n    app_name = kfdef[\"metadata\"][\"name\"]\n    platform = \"\"\n    apiVersion = kfdef[\"apiVersion\"].strip().split(\"/\")\n    if len(apiVersion) != 2:\n        raise RuntimeError(\"Invalid apiVersion: \" + kfdef[\"apiVersion\"].strip())\n    if apiVersion[-1] == \"v1alpha1\":\n        platform = kfdef[\"spec\"][\"platform\"]\n    elif apiVersion[-1] in [\"v1beta1\", \"v1\"]:\n        for plugin in kfdef[\"spec\"].get(\"plugins\", []):\n            if plugin.get(\"kind\", \"\") == \"KfGcpPlugin\":\n                platform = \"gcp\"\n            elif plugin.get(\"kind\", \"\") == \"KfAwsPlugin\":\n                platform = \"aws\"\n            elif plugin.get(\"kind\", \"\") == \"KfExistingArriktoPlugin\":\n                platform = \"existing_arrikto\"\n            else:\n                # Indicate agnostic Kubeflow Platform\n                platform = \"agnostic\"\n    else:\n        raise RuntimeError(\"Unknown version: \" + apiVersion[-1])\n    return platform, app_name\n\n\ndef check_deployments_ready(record_xml_attribute, namespace, name, deployments, cluster_name):\n    \"\"\"Test that Kubeflow deployments are successfully deployed.\n\n  Args:\n    namespace: The namespace Kubeflow is deployed to.\n  \"\"\"\n    set_logging()\n    util.set_pytest_junit(record_xml_attribute, name)\n\n    kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n\n    api_client = deploy_utils.create_k8s_client()\n\n    for deployment_name in deployments:\n        logging.info(\"Verifying that deployment %s started...\", deployment_name)\n        util.wait_for_deployment(api_client, namespace, deployment_name, 10)\n\n\ndef test_admission_is_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"admission-webhook-deployment\"\n    ]\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_admission_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_katib_is_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"katib-controller\",\n        \"katib-mysql\",\n        \"katib-db-manager\",\n        \"katib-ui\",\n    ]\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_katib_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_metadata_is_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"metadata-grpc-deployment\",\n        \"metadata-db\",\n        \"metadata-envoy-deployment\",\n        \"metadata-writer\",\n    ]\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_metadata_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_pipeline_is_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"argo-ui\",\n        \"cache-deployer-deployment\",\n        \"cache-server\",\n        \"kubeflow-pipelines-profile-controller\",\n        \"minio\",\n        \"ml-pipeline\",\n        \"ml-pipeline-persistenceagent\",\n        \"ml-pipeline-scheduledworkflow\",\n        \"ml-pipeline-ui\",\n        \"ml-pipeline-viewer-crd\",\n        \"ml-pipeline-visualizationserver\",\n        \"mysql\",\n    ]\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_pipeline_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_notebook_is_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"jupyter-web-app-deployment\",\n        \"notebook-controller-deployment\",\n    ]\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_notebook_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_centraldashboard_is_ready(record_xml_attribute, namespace, cluster_name):\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_centraldashboard_is_ready\", [\"centraldashboard\"],\n                            cluster_name)\n\n\ndef test_profiles_is_ready(record_xml_attribute, namespace, cluster_name):\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_profile_is_ready\", [\"profiles-deployment\"],\n                            cluster_name)\n\n\ndef test_seldon_is_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"seldon-controller-manager\"\n    ]\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_seldon_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_spark_is_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"spark-operatorsparkoperator\"\n    ]\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_spark_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_training_operators_are_ready(record_xml_attribute, namespace, cluster_name):\n    deployment_names = [\n        \"mpi-operator\",\n        \"mxnet-operator\",\n        \"pytorch-operator\",\n        \"tf-job-operator\",\n    ]\n\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_training_is_ready\", deployment_names,\n                            cluster_name)\n\n\ndef test_workflow_controller_is_ready(record_xml_attribute, namespace, cluster_name):\n    check_deployments_ready(record_xml_attribute, namespace,\n                            \"test_workflow_controller_is_ready\", [\"workflow-controller\"],\n                            cluster_name)\n\n\ndef test_kf_is_ready(record_xml_attribute, namespace, use_basic_auth,\n                     app_path, cluster_name):\n    \"\"\"Test that Kubeflow was successfully deployed.\n\n  Args:\n    namespace: The namespace Kubeflow is deployed to.\n  \"\"\"\n    set_logging()\n    util.set_pytest_junit(record_xml_attribute, \"test_kf_is_ready\")\n\n    kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n\n    api_client = deploy_utils.create_k8s_client()\n\n    # Verify that components are actually deployed.\n    deployment_names = []\n\n    stateful_set_names = []\n\n    daemon_set_names = []\n\n    platform, _ = get_platform_app_name(app_path)\n\n    # TODO(PatrickXYS): not sure why istio-galley can't found\n    ingress_related_deployments = [\n        \"cluster-local-gateway\",\n        \"istio-citadel\",\n        \"istio-ingressgateway\",\n        \"istio-pilot\",\n        \"istio-policy\",\n        \"istio-sidecar-injector\",\n        \"istio-telemetry\",\n        \"prometheus\",\n    ]\n    ingress_related_stateful_sets = []\n\n    knative_namespace = \"knative-serving\"\n    knative_related_deployments = [\n        \"activator\",\n        \"autoscaler\",\n        \"controller\",\n        \"networking-istio\",\n        \"webhook\",\n    ]\n\n    if platform == \"gcp\":\n        deployment_names.extend([\"cloud-endpoints-controller\"])\n        stateful_set_names.extend([\"kfserving-controller-manager\"])\n        if use_basic_auth:\n            deployment_names.extend([\"basic-auth-login\"])\n            ingress_related_stateful_sets.extend([\"backend-updater\"])\n        else:\n            ingress_related_deployments.extend([\"iap-enabler\"])\n            ingress_related_stateful_sets.extend([\"backend-updater\"])\n    elif platform == \"existing_arrikto\":\n        deployment_names.extend([\"dex\"])\n        ingress_related_deployments.extend([\"authservice\"])\n        knative_related_deployments = []\n    elif platform == \"aws\":\n        # TODO(PatrickXYS): Extend List with AWS Deployment\n        deployment_names.extend([\"alb-ingress-controller\"])\n        daemon_set_names.extend([\"nvidia-device-plugin-daemonset\"])\n\n    # TODO(jlewi): Might want to parallelize this.\n    for deployment_name in deployment_names:\n        logging.info(\"Verifying that deployment %s started...\", deployment_name)\n        util.wait_for_deployment(api_client, namespace, deployment_name, 10)\n\n    ingress_namespace = \"istio-system\"\n    for deployment_name in ingress_related_deployments:\n        logging.info(\"Verifying that deployment %s started...\", deployment_name)\n        util.wait_for_deployment(api_client, ingress_namespace, deployment_name, 10)\n\n    all_stateful_sets = [(namespace, name) for name in stateful_set_names]\n    all_stateful_sets.extend([(ingress_namespace, name) for name in ingress_related_stateful_sets])\n\n    for ss_namespace, name in all_stateful_sets:\n        logging.info(\"Verifying that stateful set %s.%s started...\", ss_namespace, name)\n        try:\n            util.wait_for_statefulset(api_client, ss_namespace, name)\n        except:\n            # Collect debug information by running describe\n            util.run([\"kubectl\", \"-n\", ss_namespace, \"describe\", \"statefulsets\", name])\n            raise\n\n    all_daemon_sets = [(namespace, name) for name in daemon_set_names]\n\n    for ds_namespace, name in all_daemon_sets:\n        logging.info(\"Verifying that daemonset set %s.%s started...\", ds_namespace, name)\n        try:\n            util.wait_for_daemonset(api_client, ds_namespace, name)\n        except:\n            # Collect debug information by running describe\n            util.run([\"kubectl\", \"-n\", ds_namespace, \"describe\", \"daemonset\", name])\n            raise\n\n    ingress_names = [\"istio-ingress\"]\n    # Check if Ingress is Ready and Healthy\n    if platform in [\"aws\"]:\n        for ingress_name in ingress_names:\n            logging.info(\"Verifying that ingress %s started...\", ingress_name)\n            util.wait_for_ingress(api_client, ingress_namespace, ingress_name, 10)\n\n    for deployment_name in knative_related_deployments:\n        logging.info(\"Verifying that deployment %s started...\", deployment_name)\n        util.wait_for_deployment(api_client, knative_namespace, deployment_name, 10)\n\n    # Check if Dex is Ready and Healthy\n    dex_deployment_names = [\"dex\"]\n    dex_namespace = \"auth\"\n    for dex_deployment_name in dex_deployment_names:\n        logging.info(\"Verifying that deployment %s started...\", dex_deployment_name)\n        util.wait_for_deployment(api_client, dex_namespace, dex_deployment_name, 10)\n\n    # Check if Cert-Manager is Ready and Healthy\n    cert_manager_deployment_names = [\n        \"cert-manager\",\n        \"cert-manager-cainjector\",\n        \"cert-manager-webhook\",\n    ]\n    cert_manager_namespace = \"cert-manager\"\n    for cert_manager_deployment_name in cert_manager_deployment_names:\n        logging.info(\"Verifying that deployment %s started...\", cert_manager_deployment_name)\n        util.wait_for_deployment(api_client, cert_manager_namespace, cert_manager_deployment_name, 10)\n\n\nif __name__ == \"__main__\":\n    logging.basicConfig(level=logging.INFO,\n                        format=('%(levelname)s|%(asctime)s'\n                                '|%(pathname)s|%(lineno)d| %(message)s'),\n                        datefmt='%Y-%m-%dT%H:%M:%S',\n                        )\n    logging.getLogger().setLevel(logging.INFO)\n    pytest.main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfam_test.py",
    "content": "import logging\n\nimport pytest\n\nfrom kubeflow.testing import util\nimport json\nfrom retrying import retry\nfrom time import sleep\nimport uuid\nfrom kubeflow.kfctl.testing.util import aws_util as kfctl_aws_util\n\n\ndef test_kfam(record_xml_attribute, cluster_name):\n  util.set_pytest_junit(record_xml_attribute, \"test_kfam_e2e\")\n  kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n\n  getcmd = \"kubectl get pods -n kubeflow -l=app=jupyter-web-app --template '{{range.items}}{{.metadata.name}}{{end}}'\"\n  jupyterpod = util.run(getcmd.split(' '))[1:-1]\n\n  logging.info(\"accessing kfam svc from jupyter pod %s\" % jupyterpod)\n\n  sleep(10)\n  # Profile Creation\n  profile_name = \"testprofile-%s\" % uuid.uuid4().hex[0:7]\n  util.run(['kubectl', 'exec', jupyterpod, '-n', 'kubeflow', '--', 'curl',\n            '--silent', '-X', 'POST', '-d',\n            '{\"metadata\":{\"name\":\"%s\"},\"spec\":{\"owner\":{\"kind\":\"User\",\"name\":\"user1@kubeflow.org\"}}}' % profile_name,\n            'profiles-kfam.kubeflow:8081/kfam/v1/profiles'])\n\n  assert verify_profile_creation(jupyterpod, profile_name)\n\n\n@retry(wait_fixed=2000, stop_max_delay=20 * 1000)\ndef verify_profile_creation(jupyterpod, profile_name):\n  # Verify Profile Creation\n  bindingsstr = util.run(['kubectl', 'exec', jupyterpod, '-n', 'kubeflow', '--', 'curl', '--silent',\n                          'profiles-kfam.kubeflow:8081/kfam/v1/bindings'])\n  bindings = json.loads(bindingsstr)\n\n  if profile_name not in [binding['referredNamespace'] for binding in bindings['bindings']]:\n    raise Exception(\"testprofile not created yet!\")\n  return True\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(level=logging.INFO,\n                      format=('%(levelname)s|%(asctime)s'\n                              '|%(pathname)s|%(lineno)d| %(message)s'),\n                      datefmt='%Y-%m-%dT%H:%M:%S',\n                      )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_create_cluster_test.py",
    "content": "import logging\nimport pytest\nimport os\nfrom kubeflow.testing import util\n\n\ndef test_create_cluster(record_xml_attribute, cluster_name, eks_cluster_version, cluster_creation_script, values):\n  \"\"\"Test Create Cluster For E2E Test.\n  Args:\n    cluster_name: Name of EKS cluster\n    eks_cluster_version: Version of EKS cluster\n    cluster_creation_script: script invoked to create a new cluster\n    values: Comma separated list of variables to substitute into config_path\n  \"\"\"\n  util.set_pytest_junit(record_xml_attribute, \"test_create_cluster\")\n\n  if values:\n    pairs = values.split(\",\")\n    path_vars = {}\n    for p in pairs:\n      k, v = p.split(\"=\")\n      path_vars[k] = v\n\n  # Create EKS Cluster\n  logging.info(\"Creating EKS Cluster\")\n  os.environ[\"CLUSTER_NAME\"] = cluster_name\n  os.environ[\"EKS_CLUSTER_VERSION\"] = eks_cluster_version\n  util.run([\"/bin/bash\", \"-c\", cluster_creation_script])\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(\n      level=logging.INFO,\n      format=('%(levelname)s|%(asctime)s'\n              '|%(pathname)s|%(lineno)d| %(message)s'),\n      datefmt='%Y-%m-%dT%H:%M:%S',\n  )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_delete_cluster_test.py",
    "content": "\"\"\"Run kfctl delete as a pytest.\n\nWe use this in order to generate a junit_xml file.\n\"\"\"\nimport logging\nimport pytest\nimport os\nfrom kubeflow.testing import util\n\n\ndef test_kfctl_delete(record_xml_attribute, cluster_deletion_script,\n                      cluster_name):\n    util.set_pytest_junit(record_xml_attribute, \"test_cluster_delete\")\n\n    if cluster_deletion_script:\n        logging.info(\"cluster_deletion_script specified: %s\", cluster_deletion_script)\n        os.environ[\"CLUSTER_NAME\"] = cluster_name\n        util.run([\"/bin/bash\", \"-c\", cluster_deletion_script])\n        return\n\n\nif __name__ == \"__main__\":\n    logging.basicConfig(level=logging.INFO,\n                        format=('%(levelname)s|%(asctime)s'\n                                '|%(pathname)s|%(lineno)d| %(message)s'),\n                        datefmt='%Y-%m-%dT%H:%M:%S',\n                        )\n    logging.getLogger().setLevel(logging.INFO)\n    pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_delete_test.py",
    "content": "\"\"\"Run kfctl delete as a pytest.\n\nWe use this in order to generate a junit_xml file.\n\"\"\"\nimport logging\nimport os\nfrom retrying import retry\nimport pytest\nfrom kubeflow.testing import util\nfrom kubeflow.kfctl.testing.util import aws_util as kfctl_aws_util\n\n\n# TODO(https://github.com/kubeflow/kfctl/issues/56): test_kfctl_delete is flaky\n# and more importantly failures block upload of GCS artifacts so for now we mark\n# it as expected to fail.\n@pytest.mark.xfail\ndef test_kfctl_delete(record_xml_attribute, kfctl_path, app_path,\n                      cluster_name):\n  util.set_pytest_junit(record_xml_attribute, \"test_kfctl_delete\")\n\n  # TODO(PatrickXYS): do we need to load kubeconfig again?\n\n  if not kfctl_path:\n    raise ValueError(\"kfctl_path is required\")\n\n  if not app_path:\n    raise ValueError(\"app_path is required\")\n\n  logging.info(\"Using kfctl path %s\", kfctl_path)\n  logging.info(\"Using app path %s\", app_path)\n\n  kfdef_path = os.path.join(app_path, \"tmp.yaml\")\n  logging.info(\"Using kfdef file path %s\", kfdef_path)\n\n  kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n\n  # We see failures because delete operation will delete cert-manager and\n  # knative-serving, and encounter timeout. To deal with this we do retries.\n  # This has a potential downside of hiding errors that are fixed by retrying.\n  @retry(stop_max_delay=60*3*1000)\n  def run_delete():\n    util.run([kfctl_path, \"delete\", \"-V\", \"-f\", kfdef_path],\n             cwd=app_path)\n\n  run_delete()\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(level=logging.INFO,\n                      format=('%(levelname)s|%(asctime)s'\n                              '|%(pathname)s|%(lineno)d| %(message)s'),\n                      datefmt='%Y-%m-%dT%H:%M:%S',\n                      )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_delete_wrong_cluster.py",
    "content": "\"\"\"Run kfctl delete as a pytest. Deletion should fail because the host\nis wrong.\n\nWe use this in order to generate a junit_xml file.\n\"\"\"\nimport logging\nimport os\nimport subprocess\nimport yaml\nfrom retrying import retry\nimport pytest\nfrom kubeflow.testing import util\nfrom kubeflow.kfctl.testing.util import aws_util as kfctl_aws_util\n\n\ndef test_kfctl_delete_wrong_cluster(record_xml_attribute, kfctl_path, app_path,\n                                     cluster_name):\n  util.set_pytest_junit(record_xml_attribute, \"test_kfctl_delete_wrong_cluster\")\n  if not kfctl_path:\n    raise ValueError(\"kfctl_path is required\")\n\n  if not app_path:\n    raise ValueError(\"app_path is required\")\n\n  logging.info(\"Using kfctl path %s\", kfctl_path)\n  logging.info(\"Using app path %s\", app_path)\n\n  kfdef_path = os.path.join(app_path, \"tmp.yaml\")\n  kfdef = {}\n  with open(kfdef_path, \"r\") as f:\n    kfdef = yaml.safe_load(f)\n\n  # Make sure we copy the correct host instead of string reference.\n  cluster = kfdef.get(\"metadata\", {}).get(\"clusterName\", \"\")[:]\n  if not cluster:\n    raise ValueError(\"cluster is not written to kfdef\")\n\n  kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n\n  @retry(stop_max_delay=60*3*1000)\n  def run_delete():\n    try:\n      # Put an obvious wrong cluster into KfDef\n      kfdef[\"metadata\"][\"clusterName\"] = \"dummy\"\n      with open(kfdef_path, \"w\") as f:\n        yaml.dump(kfdef, f)\n      util.run([kfctl_path, \"delete\", \"-V\", \"-f\", kfdef_path],\n               cwd=app_path)\n    except subprocess.CalledProcessError as e:\n      if e.output.find(\"cluster name doesn't match\") != -1:\n        return\n      else:\n        # Re-throw error if it's not expected.\n        raise e\n    finally:\n      # Restore the correct host info.\n      kfdef[\"metadata\"][\"clusterName\"] = cluster[:]\n      with open(kfdef_path, \"w\") as f:\n        yaml.dump(kfdef, f)\n\n  run_delete()\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(level=logging.INFO,\n                      format=('%(levelname)s|%(asctime)s'\n                              '|%(pathname)s|%(lineno)d| %(message)s'),\n                      datefmt='%Y-%m-%dT%H:%M:%S',\n                      )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_deploy_kubeflow_test.py",
    "content": "import logging\nimport pytest\nimport os\n\nfrom kubeflow.kfctl.testing.util import kfctl_go_test_utils as kfctl_util\nfrom kubeflow.testing import util\n\n\ndef test_build_kfctl_go(record_xml_attribute, app_path, project, use_basic_auth,\n                        use_istio, config_path, build_and_apply, kfctl_repo_path,\n                        cluster_name, values):\n  \"\"\"Test building and deploying Kubeflow.\n\n  Args:\n    app_path: The path to the Kubeflow app.\n    project: The GCP project to use.\n    use_basic_auth: Whether to use basic_auth.\n    use_istio: Whether to use Istio or not\n    config_path: Path to the KFDef spec file.\n    cluster_name: Name of EKS cluster\n    build_and_apply: whether to build and apply or apply\n    kfctl_repo_path: path to the kubeflow/kfctl repo.\n    values: Comma separated list of variables to substitute into config_path\n  \"\"\"\n  util.set_pytest_junit(record_xml_attribute, \"test_deploy_kubeflow\")\n\n  if values:\n    pairs = values.split(\",\")\n    path_vars = {}\n    for p in pairs:\n      k, v = p.split(\"=\")\n      path_vars[k] = v\n\n    config_path = config_path.format(**path_vars)\n    logging.info(\"config_path after substitution: %s\", config_path)\n\n    kfctl_path = os.path.join(kfctl_repo_path, \"bin\", \"kfctl\")\n    app_path = kfctl_util.kfctl_deploy_kubeflow(\n                  app_path, config_path, kfctl_path,\n                  build_and_apply, cluster_name)\n    logging.info(\"kubeflow app path: %s\", app_path)\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(\n      level=logging.INFO,\n      format=('%(levelname)s|%(asctime)s'\n              '|%(pathname)s|%(lineno)d| %(message)s'),\n      datefmt='%Y-%m-%dT%H:%M:%S',\n  )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_go_test.py",
    "content": "import logging\nimport pytest\n\nfrom kubeflow.kfctl.testing.util import kfctl_go_test_utils as kfctl_util\nfrom kubeflow.testing import util\n\n\ndef test_build_kfctl_go(record_xml_attribute, config_path, kfctl_repo_path, values):\n  \"\"\"Test building and deploying Kubeflow.\n\n  Args:\n    config_path: Path to the KFDef spec file.\n    kfctl_repo_path: path to the kubeflow/kfctl repo.\n    values: Comma separated list of variables to substitute into config_path\n  \"\"\"\n  util.set_pytest_junit(record_xml_attribute, \"test_build_kfctl_go\")\n\n  logging.info(\"using kfctl repo: %s\" % kfctl_repo_path)\n\n  if values:\n    pairs = values.split(\",\")\n    path_vars = {}\n    for p in pairs:\n      k, v = p.split(\"=\")\n      path_vars[k] = v\n\n    config_path = config_path.format(**path_vars)\n    logging.info(\"config_path after substitution: %s\", config_path)\n\n  kfctl_util.build_kfctl_go(kfctl_repo_path)\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(\n      level=logging.INFO,\n      format=('%(levelname)s|%(asctime)s'\n              '|%(pathname)s|%(lineno)d| %(message)s'),\n      datefmt='%Y-%m-%dT%H:%M:%S',\n  )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_second_apply.py",
    "content": "import logging\nimport os\n\nimport pytest\n\nfrom kubeflow.kfctl.testing.util import kfctl_go_test_utils as kfctl_util\nfrom kubeflow.testing import util\n\n\ndef test_second_apply(record_xml_attribute, app_path, kfctl_path):\n  \"\"\"Test that we can run kfctl apply again with error.\n\n  Args:\n    app_path: The app dir of kubeflow deployment.\n    kfctl_path: The path to kfctl binary.\n  \"\"\"\n  if not os.path.exists(kfctl_path):\n    msg = \"kfctl Go binary not found: {path}\".format(path=kfctl_path)\n    logging.error(msg)\n    raise RuntimeError(msg)\n\n  # Need to activate account for scopes.\n  if os.getenv(\"GOOGLE_APPLICATION_CREDENTIALS\"):\n    util.run([\"gcloud\", \"auth\", \"activate-service-account\",\n              \"--key-file=\" + os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]])\n\n  util.run([kfctl_path, \"apply\", \"-V\", \"-f=\" + os.path.join(app_path, \"tmp.yaml\")], cwd=app_path)\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/kfctl_upgrade_test.py",
    "content": "import logging\nimport os\n\nimport pytest\n\nfrom kubernetes import client as k8s_client\nfrom kubeflow.kfctl.testing.util import kfctl_go_test_utils as kfctl_util\nfrom kubeflow.testing import util\n\ndef test_upgrade_kubeflow(record_xml_attribute, app_path, kfctl_path, upgrade_spec_path):\n  \"\"\"Test that we can run upgrade on a Kubeflow cluster.\n\n  Args:\n    app_path: The app dir of kubeflow deployment.\n    kfctl_path: The path to kfctl binary.\n    upgrade_spec_path: The path to the upgrade spec file.\n  \"\"\"\n  kfctl_util.kfctl_upgrade_kubeflow(app_path, kfctl_path, upgrade_spec_path)\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/pytorch_job_deploy.py",
    "content": "import datetime\nimport logging\nimport os\nimport pytest\n\nfrom kubeflow.testing import util\nfrom kubernetes import client as k8s_client\nfrom kubeflow.kfctl.testing.util import aws_util as kfctl_aws_util\n\n\n@pytest.mark.xfail(reason=(\"See: https://github.com/kubeflow/kfctl/issues/199; \"\n                           \"test is flaky.\"))\ndef test_deploy_pytorchjob(kfctl_repo_path, namespace, cluster_name):\n  \"\"\"Deploy PytorchJob.\"\"\"\n  kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n  logging.info(\"using kfctl repo: %s\" % kfctl_repo_path)\n  util.run([\"kubectl\", \"apply\", \"-f\",\n            os.path.join(kfctl_repo_path,\n                         \"py/kubeflow/kfctl/testing/pytests/testdata/pytorch_job.yaml\")])\n  api_client = k8s_client.ApiClient()\n  api = k8s_client.CoreV1Api(api_client)\n\n  # If the call throws exception, let it emit as an error case.\n  resp = api.list_namespaced_pod(namespace)\n  names = {\n      \"pytorch-mnist-ddp-cpu-master-0\": False,\n      \"pytorch-mnist-ddp-cpu-worker-0\": False,\n  }\n\n  for pod in resp.items:\n    name = pod.metadata.name\n    if name in names:\n      names[name] = True\n\n  msg = []\n  for n in names:\n    if not names[n]:\n      msg.append(\"pod %s is not found\" % n)\n  if msg:\n    raise ValueError(\"; \".join(msg))\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(level=logging.INFO,\n                      format=('%(levelname)s|%(asctime)s'\n                              '|%(pathname)s|%(lineno)d| %(message)s'),\n                      datefmt='%Y-%m-%dT%H:%M:%S',\n                      )\n  logging.getLogger().setLevel(logging.INFO)\n  pytest.main()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/testdata/jupyter_test.yaml",
    "content": "apiVersion: kubeflow.org/v1\nkind: Notebook\nmetadata:\n  name: jupyter-test\nspec:\n  template:\n    spec:\n      containers:\n      - image: gcr.io/kubeflow-images-public/tensorflow-1.14.0-notebook-cpu:v1.0.0\n        name: notebook\n        resources:\n          requests:\n            cpu: 500m\n            memory: 1Gi\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/pytests/testdata/pytorch_job.yaml",
    "content": "apiVersion: kubeflow.org/v1\nkind: PyTorchJob\nmetadata:\n  name: pytorch-mnist-ddp-cpu\nspec:\n  pytorchReplicaSpecs:\n    Master:\n      replicas: 1\n      restartPolicy: OnFailure\n      template:\n        spec:\n          containers:\n          - image: gcr.io/kubeflow-ci/pytorch-mnist/traincpu:latest\n            name: pytorch\n    Worker:\n      replicas: 1\n      restartPolicy: OnFailure\n      template:\n        spec:\n          containers:\n          - image: gcr.io/kubeflow-ci/pytorch-mnist/traincpu:latest\n            name: pytorch\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/test_deploy.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2018 The Kubeflow Authors All rights reserved.\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\"\"\"Test deploying Kubeflow.\n\nRequirements:\n  This project assumes the py directory in github.com/kubeflow/tf-operator corresponds\n  to a top level Python package on the Python path.\n\n  TODO(jlewi): Come up with a better story for how we reuse the py package\n  in kubeflow/tf-operator. We should probably turn that into a legit Python pip\n  package that is built and released as part of the kubeflow/tf-operator project.\n\"\"\"\n\nimport argparse\nimport datetime\nimport json\nimport logging\nimport os\nimport errno\nimport re\nimport shutil\nimport subprocess\nimport tempfile\nimport time\nimport uuid\n\nimport requests\nimport yaml\nfrom googleapiclient import discovery, errors\nfrom kubernetes import client as k8s_client\nfrom kubernetes.client import rest\nfrom kubernetes.config import kube_config\nfrom oauth2client.client import GoogleCredentials\n\nfrom kubeflow.testing import test_util, util  # pylint: disable=no-name-in-module\nfrom kubeflow.kfctl.testing.util import vm_util\n\n# The ksonnet binary\nks = \"ks-13\"\n\ndef _setup_test(api_client, run_label):\n  \"\"\"Create the namespace for the test.\n\n  Returns:\n    test_dir: The local test directory.\n  \"\"\"\n\n  api = k8s_client.CoreV1Api(api_client)\n  namespace = k8s_client.V1Namespace()\n  namespace.api_version = \"v1\"\n  namespace.kind = \"Namespace\"\n  namespace.metadata = k8s_client.V1ObjectMeta(\n      name=run_label, labels={\n          \"app\": \"kubeflow-e2e-test\",\n      })\n\n  try:\n    logging.info(\"Creating namespace %s\", namespace.metadata.name)\n    namespace = api.create_namespace(namespace)\n    logging.info(\"Namespace %s created.\", namespace.metadata.name)\n  except rest.ApiException as e:\n    if e.status == 409:\n      logging.info(\"Namespace %s already exists.\", namespace.metadata.name)\n    else:\n      raise\n\n  return namespace\n\n\ndef create_k8s_client(_):\n  # We need to load the kube config so that we can have credentials to\n  # talk to the APIServer.\n  util.load_kube_config(persist_config=False)\n\n  # Create an API client object to talk to the K8s master.\n  api_client = k8s_client.ApiClient()\n\n  return api_client\n\n\n# TODO(jlewi): We should make this a reusable function in kubeflow/testing\n# because we will probably want to use it in other places as well.\ndef setup_kubeflow_ks_app(args, api_client):\n  \"\"\"Create a ksonnet app for Kubeflow\"\"\"\n  try:\n    os.makedirs(args.test_dir)\n  except OSError as exc:  # Python >2.5\n    if exc.errno == errno.EEXIST and os.path.isdir(args.test_dir):\n      pass\n    else:\n      raise\n\n  logging.info(\"Using test directory: %s\", args.test_dir)\n\n  namespace_name = args.namespace\n\n  namespace = _setup_test(api_client, namespace_name)\n  logging.info(\"Using namespace: %s\", namespace)\n  if args.github_token:\n    logging.info(\"Setting GITHUB_TOKEN to %s.\", args.github_token)\n    # Set a GITHUB_TOKEN so that we don't rate limited by GitHub;\n    # see: https://github.com/ksonnet/ksonnet/issues/233\n    os.environ[\"GITHUB_TOKEN\"] = args.github_token\n\n  if not os.getenv(\"GITHUB_TOKEN\"):\n    logging.warning(\"GITHUB_TOKEN not set; you will probably hit Github API \"\n                    \"limits.\")\n  # Initialize a ksonnet app.\n  app_name = \"kubeflow-test-\" + uuid.uuid4().hex[0:4]\n  util.run([\n      ks,\n      \"init\",\n      app_name,\n  ], cwd=args.test_dir)\n\n  app_dir = os.path.join(args.test_dir, app_name)\n\n  kubeflow_registry = \"github.com/kubeflow/kubeflow/tree/master/kubeflow\"\n  util.run([ks, \"registry\", \"add\", \"kubeflow\", kubeflow_registry],\n           cwd=app_dir)\n\n  # Install required packages\n  packages = [\n      \"kubeflow/common\", \"kubeflow/tf-training\", \"kubeflow/pytorch-job\",\n      \"kubeflow/argo\"\n  ]\n\n  # Instead of installing packages we edit the app.yaml file directly\n  #for p in packages:\n  # util.run([ks, \"pkg\", \"install\", p], cwd=app_dir)\n  app_file = os.path.join(app_dir, \"app.yaml\")\n  with open(app_file) as f:\n    app_yaml = yaml.load(f)\n\n  libraries = {}\n  for pkg in packages:\n    pkg = pkg.split(\"/\")[1]\n    libraries[pkg] = {\n        'gitVersion': {\n            'commitSha': 'fake',\n            'refSpec': 'fake'\n        },\n        'name': pkg,\n        'registry': \"kubeflow\"\n    }\n  app_yaml['libraries'] = libraries\n\n  with open(app_file, \"w\") as f:\n    yaml.dump(app_yaml, f)\n\n  # Create vendor directory with a symlink to the src\n  # so that we use the code at the desired commit.\n  target_dir = os.path.join(app_dir, \"vendor\", \"kubeflow\")\n\n  REPO_ORG = \"kubeflow\"\n  REPO_NAME = \"kubeflow\"\n  REGISTRY_PATH = \"kubeflow\"\n  source = os.path.join(args.test_dir, \"src\", REPO_ORG, REPO_NAME,\n                        REGISTRY_PATH)\n  logging.info(\"Creating link %s -> %s\", target_dir, source)\n  os.symlink(source, target_dir)\n\n  return app_dir\n\n\ndef deploy_model(args):\n  \"\"\"Deploy a TF model using the TF serving component.\"\"\"\n  api_client = create_k8s_client(args)\n  app_dir = setup_kubeflow_ks_app(args, api_client)\n\n  logging.info(\"Deploying tf-serving.\")\n  params = {}\n  for pair in args.params.split(\",\"):\n    k, v = pair.split(\"=\", 1)\n    if k != \"namespace\":\n      params[k] = v\n    else:\n      namespace = v\n\n  if namespace == None:\n    raise ValueError(\"namespace must be supplied in args.\")\n\n  # deployment component\n  deployComponent = \"modelServer\"\n  generate_command = [\n      ks, \"generate\", \"tf-serving-deployment-gcp\", deployComponent\n  ]\n  util.run(generate_command, cwd=app_dir)\n  ks_deploy(\n      app_dir,\n      deployComponent,\n      params,\n      env=None,\n      account=None,\n      namespace=namespace)\n\n  # service component\n  serviceComponent = \"modelServer-service\"\n  generate_command = [ks, \"generate\", \"tf-serving-service\", serviceComponent]\n  util.run(generate_command, cwd=app_dir)\n  ks_deploy(\n      app_dir,\n      serviceComponent,\n      params,\n      env=None,\n      account=None,\n      namespace=namespace)\n\n  core_api = k8s_client.CoreV1Api(api_client)\n  deploy = core_api.read_namespaced_service(args.deploy_name, args.namespace)\n  cluster_ip = deploy.spec.cluster_ip\n\n  if not cluster_ip:\n    raise ValueError(\"inception service wasn't assigned a cluster ip.\")\n  util.wait_for_deployment(\n      api_client, namespace, args.deploy_name, timeout_minutes=10)\n  logging.info(\"Verified TF serving started.\")\n\n\ndef test_successful_deployment(deployment_name):\n  \"\"\" Tests if deployment_name is successfully running using kubectl \"\"\"\n  # TODO use the python kubernetes library to get deployment status\n  # This is using kubectl right now\n  retries = 20\n  i = 0\n  while True:\n    if i == retries:\n      raise Exception('Deployment failed: ' + deployment_name)\n    try:\n      output = util.run([\"kubectl\", \"get\", \"deployment\", deployment_name, \"-n\", \"kubeflow\"])\n      logging.info(\"output = \\n\" + output)\n      if output.count('\\n') == 1:\n        output = output.split('\\n')[1]\n        output = re.split(' +', output)\n        desired_pods = output[1]\n        current_pods = output[2]\n        uptodate_pods = output[3]\n        available_pods = output[4]\n        logging.info(\"desired_pods \" + desired_pods)\n        logging.info(\"current_pods \" + current_pods)\n        logging.info(\"uptodate_pods \" + uptodate_pods)\n        logging.info(\"available_pods \" + available_pods)\n        if desired_pods == current_pods and \\\n           desired_pods == uptodate_pods and \\\n           desired_pods == available_pods:\n          return True\n    except subprocess.CalledProcessError as e:\n      logging.error(e)\n    logging.info(\"Sleeping 5 seconds and retrying..\")\n    time.sleep(5)\n    i += 1\n\n\ndef test_katib(args):\n  test_successful_deployment('katib-mysql')\n  test_successful_deployment('katib-db-manager')\n  test_successful_deployment('katib-ui')\n  test_successful_deployment('katib-controller')\n\n\ndef deploy_argo(args):\n  api_client = create_k8s_client(args)\n  app_dir = setup_kubeflow_ks_app(args, api_client)\n\n  component = \"argo\"\n  logging.info(\"Deploying argo\")\n  generate_command = [ks, \"generate\", \"argo\", component, \"--name\", \"argo\"]\n  util.run(generate_command, cwd=app_dir)\n\n  ks_deploy(app_dir, component, {}, env=None, account=None, namespace=None)\n\n  # Create a hello world workflow\n  util.run([\n      \"kubectl\", \"create\", \"-n\", \"default\", \"-f\",\n      \"https://raw.githubusercontent.com/argoproj/argo/master/examples/hello-world.yaml\"\n  ],\n           cwd=app_dir)\n\n  # Wait for 200 seconds to check if the hello-world pod was created\n  retries = 20\n  i = 0\n  while True:\n    if i == retries:\n      raise Exception('Failed to run argo workflow')\n    output = util.run([\n        \"kubectl\", \"get\", \"pods\", \"-n\", \"default\",\n        \"-lworkflows.argoproj.io/workflow\"\n    ])\n    if \"hello-world-\" in output:\n      return True\n    time.sleep(10)\n    i += 1\n\n\ndef deploy_pytorchjob(args):\n  \"\"\"Deploy Pytorchjob using the pytorch-job component\"\"\"\n  api_client = create_k8s_client(args)\n  app_dir = setup_kubeflow_ks_app(args, api_client)\n\n  component = \"example-job\"\n  logging.info(\"Deploying pytorch.\")\n  generate_command = [ks, \"generate\", \"pytorch-job\", component]\n\n  util.run(generate_command, cwd=app_dir)\n\n  params = {}\n  for pair in args.params.split(\",\"):\n    k, v = pair.split(\"=\", 1)\n    params[k] = v\n\n  ks_deploy(app_dir, component, params, env=None, account=None, namespace=None)\n\n\ndef teardown(args):\n  # Delete the namespace\n  logging.info(\"Deleting namespace %s\", args.namespace)\n  api_client = create_k8s_client(args)\n  core_api = k8s_client.CoreV1Api(api_client)\n  core_api.delete_namespace(args.namespace, {})\n\n\ndef determine_test_name(args):\n  if args.deploy_name:\n    return args.func.__name__ + \"-\" + args.deploy_name\n  return args.func.__name__\n\n\n# TODO(jlewi): We should probably make this a generic function in\n# kubeflow.testing.`\ndef wrap_test(args):\n  \"\"\"Run the tests given by args.func and output artifacts as necessary.\n  \"\"\"\n  test_name = determine_test_name(args)\n  test_case = test_util.TestCase()\n  test_case.class_name = \"KubeFlow\"\n  test_case.name = args.workflow_name + \"-\" + test_name\n  try:\n\n    def run():\n      args.func(args)\n\n    test_util.wrap_test(run, test_case)\n  finally:\n    # Test grid has problems with underscores in the name.\n    # https://github.com/kubeflow/kubeflow/issues/631\n    # TestGrid currently uses the regex junit_(^_)*.xml so we only\n    # want one underscore after junit.\n    junit_name = test_case.name.replace(\"_\", \"-\")\n    junit_path = os.path.join(args.artifacts_dir,\n                              \"junit_{0}.xml\".format(junit_name))\n    logging.info(\"Writing test results to %s\", junit_path)\n    test_util.create_junit_xml_file([test_case], junit_path)\n\n\n# TODO(jlewi): We should probably make this a reusable function since a\n# lot of test code code use it.\ndef ks_deploy(app_dir,\n              component,\n              params,\n              env=None,\n              account=None,\n              namespace=None):\n  \"\"\"Deploy the specified ksonnet component.\n  Args:\n    app_dir: The ksonnet directory\n    component: Name of the component to deployed\n    params: A dictionary of parameters to set; can be empty but should not be\n      None.\n    env: (Optional) The environment to use, if none is specified a new one\n      is created.\n    account: (Optional) The account to use.\n    namespace: (Optional) The namespace to use when adding the environment\n  Raises:\n    ValueError: If input arguments aren't valid.\n  \"\"\"\n  if not component:\n    raise ValueError(\"component can't be None.\")\n\n  # TODO(jlewi): It might be better if the test creates the app and uses\n  # the latest stable release of the ksonnet configs. That however will cause\n  # problems when we make changes to the TFJob operator that require changes\n  # to the ksonnet configs. One advantage of checking in the app is that\n  # we can modify the files in vendor if needed so that changes to the code\n  # and config can be submitted in the same pr.\n  now = datetime.datetime.now()\n  if not env:\n    env = \"e2e-\" + now.strftime(\"%m%d-%H%M-\") + uuid.uuid4().hex[0:4]\n\n  logging.info(\"Using app directory: %s\", app_dir)\n\n  if not namespace:\n    util.run([ks, \"env\", \"add\", env], cwd=app_dir)\n  else:\n    util.run([ks, \"env\", \"add\", env, \"--namespace=\" + namespace], cwd=app_dir)\n\n  for k, v in params.iteritems():\n    util.run([ks, \"param\", \"set\", \"--env=\" + env, component, k, v],\n             cwd=app_dir)\n\n  apply_command = [ks, \"apply\", env, \"-c\", component]\n  if account:\n    apply_command.append(\"--as=\" + account)\n  util.run(apply_command, cwd=app_dir)\n\n\ndef modify_minikube_config(config_path, certs_dir):\n  \"\"\"Modify the kube config file used with minikube.\n\n  This function changes the location of the certificates to certs_dir.\n\n  Args:\n    config_path: The path of the Kubernetes config file.\n    certs_dir: The directory where the certs to use with minikube are stored.\n  \"\"\"\n  with open(config_path, \"r\") as hf:\n    config = yaml.load(hf)\n\n  for cluster in config[\"clusters\"]:\n    authority = cluster[\"cluster\"][\"certificate-authority\"]\n    authority = os.path.join(certs_dir, os.path.basename(authority))\n    cluster[\"cluster\"][\"certificate-authority\"] = authority\n\n    for user in config[\"users\"]:\n      for k in [\"client-certificate\", \"client-key\"]:\n        user[\"user\"][k] = os.path.join(certs_dir,\n                                       os.path.basename(user[\"user\"][k]))\n\n  logging.info(\"Updating path of certificates in %s\", config_path)\n  with open(config_path, \"w\") as hf:\n    yaml.dump(config, hf)\n\n\ndef deploy_minikube(args):\n  \"\"\"Create a VM and setup minikube.\"\"\"\n\n  credentials = GoogleCredentials.get_application_default()\n  gce = discovery.build(\n      \"compute\", \"v1\", credentials=credentials, cache_discovery=False)\n  instances = gce.instances()\n  body = {\n      \"name\":\n      args.vm_name,\n      \"machineType\":\n      \"zones/{0}/machineTypes/n1-standard-16\".format(args.zone),\n      \"disks\": [\n          {\n              \"boot\": True,\n              \"initializeParams\": {\n                  \"sourceImage\":\n                  \"projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts\",\n                  \"diskSizeGb\": 100,\n                  \"autoDelete\": True,\n              },\n          },\n      ],\n      \"networkInterfaces\": [\n          {\n              \"accessConfigs\": [\n                  {\n                      \"name\": \"external-nat\",\n                      \"type\": \"ONE_TO_ONE_NAT\",\n                  },\n              ],\n              \"network\":\n              \"global/networks/default\",\n          },\n      ],\n  }\n  request = instances.insert(project=args.project, zone=args.zone, body=body)\n  response = None\n  try:\n    response = request.execute()\n    print(\"done\")\n  except errors.HttpError as e:\n    if not e.content:\n      raise\n    content = json.loads(e.content)\n    if content.get(\"error\", {}).get(\"code\") == requests.codes.CONFLICT:\n      # We don't want to keep going so we reraise the error after logging\n      # a helpful error message.\n      logging.error(\n          \"Either the VM or the disk %s already exists in zone \"\n          \"%s in project %s \", args.vm_name, args.zone, args.project)\n      raise\n    else:\n      raise\n\n  op_id = response.get(\"name\")\n  final_op = vm_util.wait_for_operation(gce, args.project, args.zone, op_id)\n\n  logging.info(\"Final result for insert operation: %s\", final_op)\n  if final_op.get(\"status\") != \"DONE\":\n    raise ValueError(\"Insert operation has status %s\", final_op.get(\"status\"))\n\n  if final_op.get(\"error\"):\n    message = \"Insert operation resulted in error %s\".format(\n        final_op.get(\"error\"))\n    logging.error(message)\n    raise ValueError(message)\n\n  # Locate the install minikube script.\n  install_script = os.path.join(\n      os.path.dirname(__file__), \"install_minikube.sh\")\n\n  if not os.path.exists(install_script):\n    logging.error(\"Could not find minikube install script: %s\", install_script)\n\n  vm_util.wait_for_vm(args.project, args.zone, args.vm_name)\n  vm_util.execute_script(args.project, args.zone, args.vm_name, install_script)\n\n  # Copy the .kube and .minikube files to test_dir\n  target = \"~/.kube\"\n  full_target = \"{0}:{1}\".format(args.vm_name, target)\n  logging.info(\"Copying %s to %s\", target, args.test_dir)\n  util.run([\n      \"gcloud\", \"compute\", \"--project=\" + args.project, \"scp\", \"--recurse\",\n      full_target, args.test_dir, \"--zone=\" + args.zone\n  ])\n\n  # The .minikube directory contains some really large ISO and other files that we don't need; so we\n  # only copy the files we need.\n  minikube_dir = os.path.join(args.test_dir, \".minikube\")\n  try:\n    os.makedirs(minikube_dir)\n  except OSError as exc:  # Python >2.5\n    if exc.errno == errno.EEXIST and os.path.isdir(minikube_dir):\n      pass\n    else:\n      raise\n\n  for target in [\"~/.minikube/*.crt\", \"~/.minikube/client.key\"]:\n    full_target = \"{0}:{1}\".format(args.vm_name, target)\n    logging.info(\"Copying %s to %s\", target, minikube_dir)\n    util.run([\n        \"gcloud\", \"compute\", \"--project=\" + args.project, \"scp\", \"--recurse\",\n        full_target, minikube_dir, \"--zone=\" + args.zone\n    ])\n\n  config_path = os.path.join(args.test_dir, \".kube\", \"config\")\n  modify_minikube_config(config_path, minikube_dir)\n\n\ndef teardown_minikube(args):\n  \"\"\"Delete the VM used for minikube.\"\"\"\n\n  credentials = GoogleCredentials.get_application_default()\n  gce = discovery.build(\"compute\", \"v1\", credentials=credentials)\n  instances = gce.instances()\n\n  request = instances.delete(\n      project=args.project, zone=args.zone, instance=args.vm_name)\n\n  response = request.execute()\n\n  op_id = response.get(\"name\")\n  final_op = vm_util.wait_for_operation(gce, args.project, args.zone, op_id)\n\n  logging.info(\"Final result for delete operation: %s\", final_op)\n  if final_op.get(\"status\") != \"DONE\":\n    raise ValueError(\"Delete operation has status %s\", final_op.get(\"status\"))\n\n  if final_op.get(\"error\"):\n    message = \"Delete operation resulted in error %s\".format(\n        final_op.get(\"error\"))\n    logging.error(message)\n    raise ValueError(message)\n\n  # Ensure the disk is deleted. The disk should be auto-deleted with\n  # the VM but just in case we issue a delete request anyway.\n  disks = gce.disks()\n  request = disks.delete(\n      project=args.project, zone=args.zone, disk=args.vm_name)\n\n  response = None\n  try:\n    response = request.execute()\n  except errors.HttpError as e:\n    if not e.content:\n      raise\n    content = json.loads(e.content)\n    if content.get(\"error\", {}).get(\"code\") == requests.codes.NOT_FOUND:\n      logging.info(\"Disk %s in zone %s in project %s already deleted.\",\n                   args.vm_name, args.zone, args.project)\n    else:\n      raise\n\n  if response:\n    logging.info(\"Waiting for disk to be deleted.\")\n    op_id = response.get(\"name\")\n    final_op = vm_util.wait_for_operation(gce, args.project, args.zone, op_id)\n\n    logging.info(\"Final result for disk delete operation: %s\", final_op)\n    if final_op.get(\"status\") != \"DONE\":\n      raise ValueError(\"Disk delete operation has status %s\",\n                       final_op.get(\"status\"))\n\n    if final_op.get(\"error\"):\n      message = \"Delete disk operation resulted in error %s\".format(\n          final_op.get(\"error\"))\n      logging.error(message)\n      raise ValueError(message)\n\n\ndef get_gcp_identity():\n  identity = util.run_and_output([\"gcloud\", \"config\", \"get-value\", \"account\"])\n  logging.info(\"Current GCP account: %s\", identity)\n  return identity\n\n\ndef main():  # pylint: disable=too-many-locals,too-many-statements\n  logging.getLogger().setLevel(logging.INFO)  # pylint: disable=too-many-locals\n  # create the top-level parser\n  parser = argparse.ArgumentParser(description=\"Test Kubeflow E2E.\")\n\n  parser.add_argument(\n      \"--test_dir\",\n      default=\"\",\n      type=str,\n      help=\"Directory to use for all the test files. If not set a temporary \"\n      \"directory is created.\")\n\n  parser.add_argument(\n      \"--artifacts_dir\",\n      default=\"\",\n      type=str,\n      help=\"Directory to use for artifacts that should be preserved after \"\n      \"the test runs. Defaults to test_dir if not set.\")\n\n  parser.add_argument(\n      \"--as_gcloud_user\",\n      dest=\"as_gcloud_user\",\n      action=\"store_true\",\n      help=(\"Impersonate the user corresponding to the gcloud \"\n            \"command with kubectl and ks.\"))\n  parser.add_argument(\n      \"--no-as_gcloud_user\", dest=\"as_gcloud_user\", action=\"store_false\")\n  parser.set_defaults(as_gcloud_user=False)\n\n  # TODO(jlewi): This should not be a global flag.\n  parser.add_argument(\n      \"--project\", default=None, type=str, help=\"The project to use.\")\n\n  # TODO(jlewi): This should not be a global flag.\n  parser.add_argument(\n      \"--namespace\", default=None, type=str, help=(\"The namespace to use.\"))\n\n  parser.add_argument(\n      \"--github_token\",\n      default=None,\n      type=str,\n      help=(\n          \"The GitHub API token to use. This is needed since ksonnet uses the \"\n          \"GitHub API and without it we get rate limited. For more info see: \"\n          \"https://github.com/ksonnet/ksonnet/blob/master/docs\"\n          \"/troubleshooting.md. Can also be set using environment variable \"\n          \"GITHUB_TOKEN.\"))\n\n  parser.add_argument(\n      \"--deploy_name\", default=\"\", type=str, help=\"The name of the deployment.\")\n\n  parser.add_argument(\n      \"--workflow_name\", default=\"\", type=str, help=\"The name of the workflow.\")\n\n  subparsers = parser.add_subparsers()\n\n  parser_teardown = subparsers.add_parser(\n      \"teardown\", help=\"teardown the test infrastructure.\")\n\n  parser_teardown.set_defaults(func=teardown)\n\n  parser_tf_serving = subparsers.add_parser(\n      \"deploy_model\", help=\"Deploy a TF serving model.\")\n\n  parser_tf_serving.set_defaults(func=deploy_model)\n\n  parser_tf_serving.add_argument(\n      \"--params\",\n      default=\"\",\n      type=str,\n      help=(\"Comma separated list of parameters to set on the model.\"))\n\n  parser_pytorch_job = subparsers.add_parser(\n      \"deploy_pytorchjob\", help=\"Deploy a pytorch-job\")\n\n  parser_pytorch_job.set_defaults(func=deploy_pytorchjob)\n\n  parser_pytorch_job.add_argument(\n      \"--params\",\n      default=\"\",\n      type=str,\n      help=(\"Comma separated list of parameters to set on the model.\"))\n\n  parser_argo_job = subparsers.add_parser(\"deploy_argo\", help=\"Deploy argo\")\n\n  parser_argo_job.set_defaults(func=deploy_argo)\n\n  parser_katib_test = subparsers.add_parser(\"test_katib\", help=\"Test Katib\")\n\n  parser_katib_test.set_defaults(func=test_katib)\n\n  parser_minikube = subparsers.add_parser(\n      \"deploy_minikube\", help=\"Setup a K8s cluster on minikube.\")\n\n  parser_minikube.set_defaults(func=deploy_minikube)\n\n  parser_minikube.add_argument(\n      \"--vm_name\", required=True, type=str, help=\"The name of the VM to use.\")\n\n  parser_minikube.add_argument(\n      \"--zone\",\n      default=\"us-east1-d\",\n      type=str,\n      help=\"The zone for the cluster.\")\n\n  parser_teardown_minikube = subparsers.add_parser(\n      \"teardown_minikube\", help=\"Delete the VM running minikube.\")\n\n  parser_teardown_minikube.set_defaults(func=teardown_minikube)\n\n  parser_teardown_minikube.add_argument(\n      \"--zone\",\n      default=\"us-east1-d\",\n      type=str,\n      help=\"The zone for the cluster.\")\n\n  parser_teardown_minikube.add_argument(\n      \"--vm_name\", required=True, type=str, help=\"The name of the VM to use.\")\n\n  args = parser.parse_args()\n\n  if not args.test_dir:\n    logging.info(\"--test_dir not set; using a temporary directory.\")\n\n    now = datetime.datetime.now()\n    label = \"test_deploy-\" + now.strftime(\"%m%d-%H%M-\") + uuid.uuid4().hex[0:4]\n\n    # Create a temporary directory for this test run\n    args.test_dir = os.path.join(tempfile.gettempdir(), label)\n\n  if not args.artifacts_dir:\n    args.artifacts_dir = args.test_dir\n\n  test_log = os.path.join(\n      args.artifacts_dir, \"logs\",\n      \"test_deploy.\" + args.func.__name__ + args.deploy_name + \".log.txt\")\n\n  try:\n    os.makedirs(os.path.dirname(test_log))\n  except OSError as exc:  # Python >2.5\n    if exc.errno == errno.EEXIST and os.path.isdir(os.path.dirname(test_log)):\n      pass\n    else:\n      raise\n\n  # TODO(jlewi): We should make this a util routine in kubeflow.testing.util\n  # Setup a logging file handler. This way we can upload the log outputs\n  # to gubernator.\n  root_logger = logging.getLogger()\n\n  file_handler = logging.FileHandler(test_log)\n  root_logger.addHandler(file_handler)\n  # We need to explicitly set the formatter because it will not pick up\n  # the BasicConfig.\n  formatter = logging.Formatter(\n      fmt=(\"%(levelname)s|%(asctime)s\"\n           \"|%(pathname)s|%(lineno)d| %(message)s\"),\n      datefmt=\"%Y-%m-%dT%H:%M:%S\")\n  file_handler.setFormatter(formatter)\n  logging.info(\"Logging to %s\", test_log)\n  util.run([ks, \"version\"])\n\n  util.maybe_activate_service_account()\n  config_file = os.path.expanduser(kube_config.KUBE_CONFIG_DEFAULT_LOCATION)\n\n  # Print out the config to help debugging.\n  output = util.run_and_output([\"gcloud\", \"config\", \"config-helper\"])\n  logging.info(\"gcloud config: \\n%s\", output)\n  wrap_test(args)\n\n\nif __name__ == \"__main__\":\n  logging.basicConfig(\n      level=logging.INFO,\n      format=('%(levelname)s|%(asctime)s'\n              '|%(pathname)s|%(lineno)d| %(message)s'),\n      datefmt='%Y-%m-%dT%H:%M:%S',\n  )\n  logging.getLogger().setLevel(logging.INFO)\n  main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/test_deploy_test.py",
    "content": "# -*- coding: utf-8 -*-\nimport tempfile\nimport unittest\nimport yaml\n\nfrom kubeflow.kfctl.testing import test_deploy\n\n\nclass TestDeploy(unittest.TestCase):\n\n  def testModifyMinikubeConfig(self):\n    \"\"\"Test modeify_minikube_config\"\"\"\n\n    config_path = None\n    with tempfile.NamedTemporaryFile(delete=False) as hf:\n      config_path = hf.name\n      hf.write(\"\"\"apiVersion: v1\nclusters:\n- cluster:\n    certificate-authority: /home/jlewi/.minikube/ca.crt\n    server: https://10.240.0.18:8443\n  name: minikube\ncontexts:\n- context:\n    cluster: minikube\n    user: minikube\n  name: minikube\ncurrent-context: minikube\nkind: Config\npreferences: {}\nusers:\n- name: minikube\n  user:\n    as-user-extra: {}\n    client-certificate: /home/jlewi/.minikube/client.crt\n    client-key: /home/jlewi/.minikube/client.key\n\"\"\")\n\n    test_deploy.modify_minikube_config(config_path, \"/test/.minikube\")\n\n    # Load the output.\n    with open(config_path) as hf:\n      config = yaml.load(hf)\n\n    expected = {\n        \"apiVersion\":\n        \"v1\",\n        \"clusters\": [{\n            \"cluster\": {\n                \"certificate-authority\": \"/test/.minikube/ca.crt\",\n                \"server\": \"https://10.240.0.18:8443\"\n            },\n            \"name\": \"minikube\"\n        }],\n        \"contexts\": [{\n            \"context\": {\n                \"cluster\": \"minikube\",\n                \"user\": \"minikube\"\n            },\n            \"name\": \"minikube\"\n        }],\n        \"current-context\":\n        \"minikube\",\n        \"kind\":\n        \"Config\",\n        \"preferences\": {},\n        \"users\": [{\n            \"name\": \"minikube\",\n            \"user\": {\n                \"as-user-extra\": {},\n                \"client-certificate\": \"/test/.minikube/client.crt\",\n                \"client-key\": \"/test/.minikube/client.key\"\n            }\n        }]\n    }\n\n    self.assertDictEqual(expected, config)\n\n\nif __name__ == \"__main__\":\n  unittest.main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/__init__.py",
    "content": ""
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/application_util.py",
    "content": "\"\"\"Utilities for updating various Kubeflow applications.\"\"\"\n\nimport logging\nimport os\nimport pathlib\nimport tempfile\n\nfrom kubeflow.testing import util # pylint: disable=no-name-in-module\n\nimport yaml\n\ndef set_kustomize_image(kustomize_file, image_name, image):\n  \"\"\"Set the image using kustomize.\n\n  Args:\n    kustomize_file: Path to the kustomize file\n    image_name: The name for the image as defined in the images section\n      of the kustomization file\n    image: New image to set\n\n  Returns:\n    True if the image was updated and false other wise\n  \"\"\"\n  kustomize_dir = os.path.dirname(kustomize_file)\n\n  with open(kustomize_file) as hf:\n    config = yaml.load(hf)\n\n  old_image = \"\"\n  for i in config.get(\"images\"):\n    if i[\"name\"] == image_name:\n      old_image = i.get(\"newName\", image_name) + \":\" + i.get(\"newTag\", \"\")\n      break\n\n  if old_image == image:\n    logging.info(\"Not updating %s; image is already %s\", kustomize_file,\n                     image)\n\n    return False\n\n  util.run([\"kustomize\", \"edit\", \"set\", \"image\",\n            \"{0}={1}\".format(image_name, image)],\n           cwd=kustomize_dir)\n\n  return True\n\ndef regenerate_manifest_tests(manifests_dir):\n  \"\"\"Regenerate manifest tests\n\n  Args:\n    manifests_dir: Directory where kubeflow/manifests is\n      checked out\n  \"\"\"\n  # See https://github.com/kubeflow/manifests/issues/317\n  # We can only run make generate under our GOPATH\n  # So first we have to ensure the source code is linked\n  # from our gopath.\n  go_path = os.getenv(\"GOPATH\")\n\n  if not go_path:\n    raise ValueError(\"GOPATH not set\")\n\n  parent_dir = os.path.join(go_path, \"src\",\n                            \"github.com\", \"kubeflow\")\n\n  if not os.path.exists(parent_dir):\n    logging.info(\"Creating directory %s\", parent_dir)\n    os.makedirs(parent_dir)\n  else:\n    logging.info(\"Directory %s already exists\", parent_dir)\n\n  target = os.path.join(parent_dir, \"manifests\")\n\n  if os.path.exists(target):\n    logging.info(\"%s already exists\", target)\n    p = pathlib.Path(target)\n    if p.resolve() != pathlib.Path(manifests_dir):\n      raise ValueError(\"%s exists but doesn't point to %s\",\n                       target, manifests_dir)\n  else:\n    logging.info(\"Creating symlink %s -> %s\", target, manifests_dir)\n    os.symlink(manifests_dir, target)\n\n  test_dir = os.path.join(target, \"tests\")\n  with tempfile.NamedTemporaryFile(delete=False, mode=\"w\") as hf:\n    hf.write(\"#!/bin/bash\\n\")\n    hf.write(\"set -ex\\n\")\n    hf.write(\"cd {0}\\n\".format(test_dir))\n    hf.write(\"make generate \\n\")\n    script = hf.name\n\n  # TODO(jlewi): This is a weird hack to run make generate for the tests.\n  # make generate needs to be run from ${GOPATH}/src/kubeflow/manifests.\n  # Simply setting cwd doesn't appear to impact the script; probably something\n  # to do with symlinks? So we write a simply script that executes a CD\n  # and then runs make generate.\n  util.run([\"bash\", script], cwd=os.path.join(target, \"tests\"))\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/application_util_test.py",
    "content": "import logging\nimport os\nimport shutil\nimport tempfile\nimport unittest\n\nfrom kubeflow.kfctl.testing.util import application_util\nfrom kubeflow.kfctl.testing.ci import update_jupyter_web_app\n\nimport yaml\n\n\nclass ApplicationUttilTest(unittest.TestCase):\n  def test_set_image(self):\n    \"\"\"Verify that we can set the image\"\"\"\n    temp_dir = tempfile.mkdtemp()\n    this_dir = os.path.dirname(__file__)\n    test_app = os.path.join(this_dir, \"test_data\", \"test_app\")\n    logging.info(\"Copying %s to %s\", test_app, temp_dir)\n    app_dir = os.path.join(temp_dir, \"test_app\")\n    shutil.copytree(test_app, app_dir)\n\n    kustomize_file = os.path.join(app_dir, \"kustomization.yaml\")\n    image_name = update_jupyter_web_app.JUPYTER_WEB_APP_IMAGE_NAME\n    new_image = \"gcr.io/newrepo/newwebapp:1.0\"\n    application_util.set_kustomize_image(kustomize_file, image_name, new_image)\n\n    with open(os.path.join(app_dir, \"kustomization.yaml\")) as hf:\n      new_config = yaml.load(hf)\n\n    self.assertEqual(new_config[\"images\"][0][\"newName\"],\n                     \"gcr.io/newrepo/newwebapp\")\n    self.assertEqual(new_config[\"images\"][0][\"newTag\"], \"1.0\")\n\nif __name__ == \"__main__\":\n  logging.getLogger().setLevel(logging.INFO)\n  unittest.main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/aws_util.py",
    "content": "import os\nimport logging\nfrom kubeflow.testing import util\nfrom kubeflow.testing.cloudprovider.aws import util as aws_util\n\n\ndef aws_auth_load_kubeconfig(cluster_name):\n    logging.info(\"updating ~/.kube/config file of the EKS cluster\")\n    util.run([\"aws\", \"eks\", \"update-kubeconfig\", \"--name=\" + cluster_name])\n\n    aws_util.load_kube_config()"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/deploy_utils.py",
    "content": "# -*- coding: utf-8 -*-\nimport argparse\nimport datetime\nimport json\nimport logging\nimport os\nimport shutil\nimport ssl\nimport tempfile\nimport time\nimport uuid\n\nimport requests\nimport yaml\nfrom googleapiclient import discovery, errors\nfrom kubernetes import client as k8s_client\nfrom kubernetes.client import rest\nfrom kubernetes.config import kube_config\nfrom oauth2client.client import GoogleCredentials\n\nfrom kubeflow.testing import test_util, util  # pylint: disable=no-name-in-module  # noqa: E501\nfrom kubeflow.kfctl.testing.util import vm_util\n\n\ndef get_gcp_identity():\n  identity = util.run([\"gcloud\", \"config\", \"get-value\", \"account\"])\n  logging.info(\"Current GCP account: %s\", identity)\n  return identity\n\n\ndef create_k8s_client():\n  # We need to load the kube config so that we can have credentials to\n  # talk to the APIServer.\n  util.load_kube_config(persist_config=False)\n\n  # Create an API client object to talk to the K8s master.\n  api_client = k8s_client.ApiClient()\n\n  return api_client\n\n\ndef _setup_test(api_client, run_label):\n  \"\"\"Create the namespace for the test.\n\n  Returns:\n    test_dir: The local test directory.\n  \"\"\"\n\n  api = k8s_client.CoreV1Api(api_client)\n  namespace = k8s_client.V1Namespace()\n  namespace.api_version = \"v1\"\n  namespace.kind = \"Namespace\"\n  namespace.metadata = k8s_client.V1ObjectMeta(\n      name=run_label, labels={\n          \"app\": \"kubeflow-e2e-test\",\n      })\n\n  try:\n    logging.info(\"Creating namespace %s\", namespace.metadata.name)\n    namespace = api.create_namespace(namespace)\n    logging.info(\"Namespace %s created.\", namespace.metadata.name)\n  except rest.ApiException as e:\n    if e.status == 409:\n      logging.info(\"Namespace %s already exists.\", namespace.metadata.name)\n    else:\n      raise\n\n  return namespace\n\n\ndef setup_kubeflow_ks_app(dir, namespace, github_token, api_client):\n  \"\"\"Create a ksonnet app for Kubeflow\"\"\"\n  util.makedirs(dir)\n\n  logging.info(\"Using test directory: %s\", dir)\n\n  namespace_name = namespace\n\n  namespace = _setup_test(api_client, namespace_name)\n  logging.info(\"Using namespace: %s\", namespace)\n  if github_token:\n    logging.info(\"Setting GITHUB_TOKEN to %s.\", github_token)\n    # Set a GITHUB_TOKEN so that we don't rate limited by GitHub;\n    # see: https://github.com/ksonnet/ksonnet/issues/233\n    os.environ[\"GITHUB_TOKEN\"] = github_token\n\n  if not os.getenv(\"GITHUB_TOKEN\"):\n    logging.warning(\"GITHUB_TOKEN not set; you will probably hit Github API \"\n                    \"limits.\")\n  # Initialize a ksonnet app.\n  app_name = \"kubeflow-test-\" + uuid.uuid4().hex[0:4]\n  util.run([\n      \"ks\",\n      \"init\",\n      app_name,\n  ], cwd=dir)\n\n  app_dir = os.path.join(dir, app_name)\n\n  # Set the default namespace.\n  util.run([\"ks\", \"env\", \"set\", \"default\", \"--namespace=\" + namespace_name],\n           cwd=app_dir)\n\n  kubeflow_registry = \"github.com/kubeflow/kubeflow/tree/master/kubeflow\"\n  util.run([\"ks\", \"registry\", \"add\", \"kubeflow\", kubeflow_registry],\n           cwd=app_dir)\n\n  # Install required packages\n  packages = [\n      \"kubeflow/common\", \"kubeflow/gcp\", \"kubeflow/jupyter\",\n      \"kubeflow/tf-serving\", \"kubeflow/tf-job\", \"kubeflow/tf-training\",\n      \"kubeflow/pytorch-job\", \"kubeflow/argo\", \"kubeflow/katib\"\n  ]\n\n  # Instead of installing packages we edit the app.yaml file directly for p in\n  # packages:\n  # util.run([\"ks\", \"pkg\", \"install\", p], cwd=app_dir)\n  app_file = os.path.join(app_dir, \"app.yaml\")\n  with open(app_file) as f:\n    app_yaml = yaml.load(f)\n\n  libraries = {}\n  for pkg in packages:\n    pkg = pkg.split(\"/\")[1]\n    libraries[pkg] = {\n        'gitVersion': {\n            'commitSha': 'fake',\n            'refSpec': 'fake'\n        },\n        'name': pkg,\n        'registry': \"kubeflow\"\n    }\n  app_yaml['libraries'] = libraries\n\n  with open(app_file, \"w\") as f:\n    yaml.dump(app_yaml, f)\n\n  # Create vendor directory with a symlink to the src so that we use the code\n  # at the desired commit.\n  target_dir = os.path.join(app_dir, \"vendor\", \"kubeflow\")\n\n  REPO_ORG = \"kubeflow\"\n  REPO_NAME = \"kubeflow\"\n  REGISTRY_PATH = \"kubeflow\"\n  source = os.path.join(dir, \"src\", REPO_ORG, REPO_NAME, REGISTRY_PATH)\n  logging.info(\"Creating link %s -> %s\", target_dir, source)\n  os.symlink(source, target_dir)\n\n  return app_dir\n\n\ndef log_operation_status(operation):\n  \"\"\"A callback to use with wait_for_operation.\"\"\"\n  name = operation.get(\"name\", \"\")\n  status = operation.get(\"status\", \"\")\n  logging.info(\"Operation %s status %s\", name, status)\n\n\ndef wait_for_operation(client,\n                       project,\n                       op_id,\n                       timeout=datetime.timedelta(hours=1),\n                       polling_interval=datetime.timedelta(seconds=5),\n                       status_callback=log_operation_status):\n  \"\"\"Wait for the specified operation to complete.\n\n  Args:\n    client: Client for the API that owns the operation.\n    project: project\n    op_id: Operation id.\n    timeout: A datetime.timedelta expressing the amount of time to wait before\n      giving up.\n    polling_interval: A datetime.timedelta to represent the amount of time to\n      wait between requests polling for the operation status.\n\n  Returns:\n    op: The final operation.\n\n  Raises:\n    TimeoutError: if we timeout waiting for the operation to complete.\n  \"\"\"\n  endtime = datetime.datetime.now() + timeout\n  while True:\n    try:\n      op = client.operations().get(project=project, operation=op_id).execute()\n\n      if status_callback:\n        status_callback(op)\n\n      status = op.get(\"status\", \"\")\n      # Need to handle other status's\n      if status == \"DONE\":\n        return op\n    except ssl.SSLError as e:\n      logging.error(\"Ignoring error %s\", e)\n    if datetime.datetime.now() > endtime:\n      raise TimeoutError(\n          \"Timed out waiting for op: {0} to complete.\".format(op_id))\n    time.sleep(polling_interval.total_seconds())\n\n  # Linter complains if we don't have a return here even though its unreachable\n  return None\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/gcp_util.py",
    "content": "import datetime\nimport logging\nimport os\nfrom time import sleep\nfrom google.auth.transport.requests import Request\nfrom google.oauth2 import id_token\n\nimport requests\nfrom retrying import retry\nfrom requests.exceptions import SSLError\nfrom requests.exceptions import ConnectionError as ReqConnectionError\n\nCOOKIE_NAME = \"KUBEFLOW-AUTH-KEY\"\n\ndef may_get_env_var(name):\n  env_val = os.getenv(name)\n  if env_val:\n    logging.info(\"%s is set\", name)\n    return env_val\n\n  raise Exception(\"%s not set\" % name)\n\n# Code copied from:\n# https://cloud.google.com/iap/docs/authentication-howto#iap_make_request-python\ndef make_iap_request(url, client_id, method='GET', **kwargs):\n    \"\"\"Makes a request to an application protected by Identity-Aware Proxy.\n\n    Args:\n      url: The Identity-Aware Proxy-protected URL to fetch.\n      client_id: The client ID used by Identity-Aware Proxy.\n      method: The request method to use\n              ('GET', 'OPTIONS', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE')\n      **kwargs: Any of the parameters defined for the request function:\n                https://github.com/requests/requests/blob/master/requests/api.py\n                If no timeout is provided, it is set to 90 by default.\n\n    Returns:\n      The page body, or raises an exception if the page couldn't be retrieved.\n    \"\"\"\n    # Set the default timeout, if missing\n    if 'timeout' not in kwargs:\n        kwargs['timeout'] = 90\n\n    # Obtain an OpenID Connect (OIDC) token from metadata server or using service\n    # account.\n    google_open_id_connect_token = id_token.fetch_id_token(Request(), client_id)\n\n    # Fetch the Identity-Aware Proxy-protected URL, including an\n    # Authorization header containing \"Bearer \" followed by a\n    # Google-issued OpenID Connect token for the service account.\n    resp = requests.request(\n        method, url,\n        headers={'Authorization': 'Bearer {}'.format(\n            google_open_id_connect_token)}, **kwargs)\n    if resp.status_code == 403: # pylint: disable=no-else-raise\n        raise Exception('Service account does not have permission to '\n                        'access the IAP-protected application.')\n    elif resp.status_code != 200: # pylint: disable=no-else-raise\n        raise Exception(\n            'Bad response from application: {!r} / {!r} / {!r}'.format(\n                resp.status_code, resp.headers, resp.text))\n    else:\n        return resp.text\n\ndef iap_is_ready(url, wait_min=15):\n  \"\"\"\n  Checks if the kubeflow endpoint is ready.\n\n  Args:\n    url: The url endpoint\n  Returns:\n    True if the url is ready\n  \"\"\"\n  client_id = may_get_env_var(\"CLIENT_ID\")\n  # Wait up to 30 minutes for IAP access test.\n  num_req = 0\n  end_time = datetime.datetime.now() + datetime.timedelta(\n      minutes=wait_min)\n  while datetime.datetime.now() < end_time:\n    num_req += 1\n    logging.info(\"Trying url: %s\", url)\n    try:\n      resp = make_iap_request(url, client_id, method=\"GET\", verify=False)\n      logging.info(\"Response: %s\", resp)\n      logging.info(\"Endpoint is ready for %s!\", url)\n      return True\n    except Exception as e: # pylint: disable=broad-except\n      logging.info(\"%s: Endpoint not ready, exception caught %s, request \"\n                   \"number: %s\", url, str(e), num_req)\n    sleep(10)\n  return False\n\ndef _send_req(wait_sec, url, req_gen, retry_result_code=None):\n  \"\"\" Helper function to send requests and retry when the endpoint is not ready.\n\n  Args:\n  wait_sec: int, max time to wait and retry in seconds.\n  url: str, url to send the request, used only for logging.\n  req_gen: lambda, no parameter function to generate requests.Request for the\n  function to send to the endpoint.\n  retry_result_code: int (optional), status code to match or retry the request.\n\n  Returns:\n    requests.Response\n  \"\"\"\n\n  def retry_on_error(e):\n    return isinstance(e, (SSLError, ReqConnectionError))\n\n  # generates function to see if the request needs to be retried.\n  # if param `code` is None, will not retry and directly pass back the response.\n  # Otherwise will retry if status code is not matched.\n  def retry_on_result_func(code):\n    if code is None:\n      return lambda _: False\n\n    return lambda resp: not resp or resp.status_code != code\n\n  @retry(stop_max_delay=wait_sec * 1000, wait_fixed=10 * 1000,\n         retry_on_exception=retry_on_error,\n         retry_on_result=retry_on_result_func(retry_result_code))\n  def _send(url, req_gen):\n    resp = None\n    logging.info(\"sending request to %s\", url)\n    try:\n      resp = req_gen()\n    except Exception as e:\n      logging.warning(\"%s: request with error: %s\", url, e)\n      raise e\n    return resp\n\n  return _send(url, req_gen)\n\n# TODO(jlewi): basic_auth is no longer supported so we could probably\n# delete this code path.\ndef basic_auth_is_ready(url, username, password, wait_min=15):\n  get_url = url + \"/kflogin\"\n  post_url = url + \"/apikflogin\"\n\n  end_time = datetime.datetime.now() + datetime.timedelta(\n      minutes=wait_min)\n\n  wait_time = datetime.datetime.now() - end_time\n  resp = _send_req(wait_time.seconds, get_url, lambda: requests.request(\n      \"GET\",\n      get_url,\n      verify=False), retry_result_code=200)\n\n  logging.info(\"%s: endpoint is ready; response: %s\", get_url, resp.text)\n  logging.info(\"%s: testing login API\", post_url)\n\n  wait_time = datetime.datetime.now() - end_time\n  resp = _send_req(wait_time.seconds, post_url, lambda: requests.post(\n      post_url,\n      auth=(username, password),\n      headers={\n          \"x-from-login\": \"true\",\n      },\n      verify=False))\n  logging.info(\"%s: %s\", post_url, resp.text)\n  if resp.status_code != 205:\n    logging.error(\"%s: login is failed\", post_url)\n    return False\n\n  logging.info(\"%s: testing cookies credentials\", url)\n  cookie = None\n  for c in resp.cookies:\n    if c.name == COOKIE_NAME:\n      cookie = c\n      break\n  if cookie is None:\n    logging.error(\"%s: auth cookie cannot be found; name: %s\",\n                  post_url, COOKIE_NAME)\n    return False\n\n  wait_time = datetime.datetime.now() - end_time\n  resp = _send_req(wait_time.seconds, url, lambda: requests.get(\n      url,\n      cookies={\n          cookie.name: cookie.value,\n      },\n      verify=False))\n  logging.info(\"%s: %s\", url, resp.status_code)\n  logging.info(resp.content)\n  return resp.status_code == 200\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/kfctl_go_test_utils.py",
    "content": "\"\"\"Common reusable steps for kfctl go testing.\"\"\"\nimport datetime\nimport json\nimport logging\nimport os\nimport tempfile\nimport urllib\nimport uuid\n\nimport requests\nimport yaml\nfrom kubeflow.testing import util\nfrom kubeflow.testing.cloudprovider.aws import util as aws_util\nfrom kubeflow.kfctl.testing.util import aws_util as kfctl_aws_util\nfrom kubeflow.testing.cloudprovider.aws import prow_artifacts as aws_prow_artifacts\nfrom retrying import retry\n\n\n# retry 4 times, waiting 3 minutes between retries\n@retry(stop_max_attempt_number=4, wait_fixed=180000)\ndef run_with_retries(*args, **kwargs):\n  util.run(*args, **kwargs)\n\ndef build_kfctl_go(kfctl_repo_path):\n  \"\"\"build the kfctl go binary and return the path for the same.\n\n  Args:\n    kfctl_repo_path (str): Path to kfctl repo.\n\n  Return:\n    kfctl_path (str): Path where kfctl go binary has been built.\n            will be Kubeflow/kubeflow/bootstrap/bin/kfctl\n  \"\"\"\n  kfctl_path = os.path.join(kfctl_repo_path, \"bin\", \"kfctl\")\n  # We need to use retry builds because when building in the test cluster\n  # we see intermittent failures pulling dependencies\n  run_with_retries([\"make\", \"build-kfctl\"], cwd=kfctl_repo_path)\n  return kfctl_path\n\ndef get_or_create_app_path_and_parent_dir(app_path):\n  \"\"\"Get a valid app_path and parent dir. Create if they are not existing.\n  \"\"\"\n  if not app_path:\n    logging.info(\"--app_path not specified\")\n    stamp = datetime.datetime.now().strftime(\"%H%M\")\n    parent_dir = tempfile.gettempdir()\n    app_path = os.path.join(\n      parent_dir, \"kfctl-{0}-{1}\".format(stamp,\n                         uuid.uuid4().hex[0:4]))\n  else:\n    parent_dir = os.path.dirname(app_path)\n\n  if not os.path.exists(parent_dir):\n    os.makedirs(parent_dir)\n  if not os.path.exists(app_path):\n    os.makedirs(app_path)\n\n  return app_path, parent_dir\n\ndef load_config(config_path):\n  \"\"\"Load specified KFDef.\n\n  Args:\n    config_path: Path to a YAML file containing a KFDef object.\n    Can be a local path or a URI like\n    https://raw.githubusercontent.com/kubeflow/manifests/master/kfdef/kfctl_gcp_iap.yaml\n  Returns:\n    config_spec: KfDef spec\n  \"\"\"\n  url_for_spec = urllib.parse.urlparse(config_path)\n\n  if url_for_spec.scheme in [\"http\", \"https\"]:\n    data = requests.get(config_path)\n    return yaml.load(data.content)\n  else:\n    with open(config_path, 'r') as f:\n      config_spec = yaml.load(f)\n      return config_spec\n\ndef set_env_for_auth(use_basic_auth):\n  logging.info(\"use_basic_auth=%s\", use_basic_auth)\n  # Set ENV for basic auth username/password.\n  if use_basic_auth:\n    # Don't log the password.\n    # logging.info(\"Setting environment variables KUBEFLOW_USERNAME and KUBEFLOW_PASSWORD\")\n    os.environ[\"KUBEFLOW_USERNAME\"] = \"kf-test-user\"\n    os.environ[\"KUBEFLOW_PASSWORD\"] = str(uuid.uuid4().hex)\n  else:\n    # Owned by project kubeflow-ci-deployment.\n    logging.info(\"Setting environment variables CLIENT_SECRET and CLIENT_ID\")\n    os.environ[\"CLIENT_SECRET\"] = \"CJ4qVPLTi0j0GJMkONj7Quwt\"\n    os.environ[\"CLIENT_ID\"] = (\n      \"29647740582-7meo6c7a9a76jvg54j0g2lv8lrsb4l8g\"\n      \".apps.googleusercontent.com\")\n\ndef set_env_init_args(config_spec):\n  gcp_plugin = {}\n  for plugin in config_spec.get(\"spec\", {}).get(\"plugins\", []):\n    if plugin.get(\"kind\", \"\") == \"KfGcpPlugin\":\n      gcp_plugin = plugin\n      break\n  use_basic_auth = gcp_plugin.get(\"spec\", {}).get(\"useBasicAuth\", False)\n  set_env_for_auth(use_basic_auth)\n\ndef write_basic_auth_login(filename):\n  \"\"\"Read basic auth login from ENV and write to the filename given. If username/password\n  cannot be found in ENV, this function will silently return.\n\n  Args:\n    filename: The filename (directory/file name) the login is writing to.\n  \"\"\"\n  username = os.environ.get(\"KUBEFLOW_USERNAME\", \"\")\n  password = os.environ.get(\"KUBEFLOW_PASSWORD\", \"\")\n\n  if not username or not password:\n    return\n\n  with open(filename, \"w\") as f:\n    login = {\n        \"username\": username,\n        \"password\": password,\n    }\n    json.dump(login, f)\n\ndef filter_spartakus(spec):\n  \"\"\"Filter our Spartakus from KfDef spec.\n\n  Args:\n    spec: KfDef spec\n\n  Returns:\n    spec: Filtered KfDef spec\n  \"\"\"\n  for i, app in enumerate(spec[\"applications\"]):\n    if app[\"name\"] == \"spartakus\":\n      spec[\"applications\"].pop(i)\n      break\n  return spec\n\ndef get_config_spec(config_path, app_path, cluster_name):\n  \"\"\"Generate KfDef spec.\n\n  Args:\n    config_path: Path to a YAML file containing a KFDef object.\n    Can be a local path or a URI like\n    https://raw.githubusercontent.com/kubeflow/manifests/master/kfdef/kfctl_gcp_iap.yaml\n    app_path: The path to the Kubeflow app.\n    cluster_name: Name of EKS cluster\n  Returns:\n    config_spec: Updated KfDef spec\n  \"\"\"\n  # TODO(https://github.com/kubeflow/kubeflow/issues/2831): Once kfctl\n  # supports loading version from a URI we should use that so that we\n  # pull the configs from the repo we checked out.\n  config_spec = load_config(config_path)\n\n  repos = config_spec[\"spec\"][\"repos\"]\n  manifests_repo_name = \"manifests\"\n  if os.getenv(\"REPO_NAME\") == manifests_repo_name:\n    # kfctl_go_test.py was triggered on presubmit from the kubeflow/manifests\n    # repository. In this case we want to use the specified PR of the\n    # kubeflow/manifests repository; so we need to change the repo specification\n    # in the KFDef spec.\n    # TODO(jlewi): We should also point to a specific commit when triggering\n    # postsubmits from the kubeflow/manifests repo\n    for repo in repos:\n      if repo[\"name\"] !=  manifests_repo_name:\n        continue\n\n      version = None\n\n      if os.getenv(\"PULL_PULL_SHA\"):\n        # Presubmit\n        version = os.getenv(\"PULL_PULL_SHA\")\n\n      # See https://github.com/kubernetes/test-infra/blob/45246b09ed105698aa8fb928b7736d14480def29/prow/jobs.md#job-environment-variables  # pylint: disable=line-too-long\n      elif os.getenv(\"PULL_BASE_SHA\"):\n        version = os.getenv(\"PULL_BASE_SHA\")\n\n      if version:\n        repo[\"uri\"] = (\"https://github.com/kubeflow/manifests/archive/\"\n                       \"{0}.tar.gz\").format(version)\n        logging.info(\"Overwriting the URI\")\n      else:\n        # Its a periodic job so use whatever value is set in the KFDef\n        logging.info(\"Not overwriting manifests version\")\n    logging.info(str(config_spec))\n  return config_spec\n\ndef kfctl_deploy_kubeflow(app_path, config_path, kfctl_path, build_and_apply, cluster_name):\n  \"\"\"Deploy kubeflow.\n\n  Args:\n  app_path: The path to the Kubeflow app.\n  config_path: Path to the KFDef spec file.\n  kfctl_path: Path to the kfctl go binary\n  build_and_apply: whether to build and apply or apply\n  cluster_name: Name of EKS cluster\n  Returns:\n  app_path: Path where Kubeflow is installed\n  \"\"\"\n  # build_and_apply is a boolean used for testing both the new semantics\n  # test case 1: build_and_apply\n  # kfctl build -f <config file>\n  # kfctl apply\n  # test case 2: apply\n  # kfctl apply -f <config file>\n\n  kfctl_aws_util.aws_auth_load_kubeconfig(cluster_name)\n\n  if not os.path.exists(kfctl_path):\n    msg = \"kfctl Go binary not found: {path}\".format(path=kfctl_path)\n    logging.error(msg)\n    raise RuntimeError(msg)\n\n  app_path, parent_dir = get_or_create_app_path_and_parent_dir(app_path)\n\n  logging.info(\"app path %s\", app_path)\n  logging.info(\"kfctl path %s\", kfctl_path)\n\n  config_spec = get_config_spec(config_path, app_path, cluster_name)\n  with open(os.path.join(app_path, \"tmp.yaml\"), \"w\") as f:\n    yaml.dump(config_spec, f)\n\n  # build_and_apply\n  logging.info(\"running kfctl with build and apply: %s \\n\", build_and_apply)\n\n  logging.info(\"switching working directory to: %s \\n\", app_path)\n  os.chdir(app_path)\n\n  # push newly built kfctl to S3\n  push_kfctl_to_s3(kfctl_path)\n\n  # Workaround to fix issue\n  # msg=\"Encountered error applying application bootstrap:  (kubeflow.error): Code 500 with message: Apply.Run\n  # : error when creating \\\"/tmp/kout927048001\\\": namespaces \\\"kubeflow-test-infra\\\" not found\"\n  # filename=\"kustomize/kustomize.go:266\"\n  # TODO(PatrickXYS): fix the issue permanentely rather than work-around\n  util.run([\"kubectl\", \"create\", \"namespace\", \"kubeflow-test-infra\"])\n\n  # Do not run with retries since it masks errors\n  logging.info(\"Running kfctl with config:\\n%s\", yaml.safe_dump(config_spec))\n  if build_and_apply:\n    build_and_apply_kubeflow(kfctl_path, app_path)\n  else:\n    apply_kubeflow(kfctl_path, app_path)\n  return app_path\n\ndef push_kfctl_to_s3(kfctl_path):\n  bucket = aws_prow_artifacts.AWS_PROW_RESULTS_BUCKET\n  logging.info(\"Bucket name: %s\", aws_prow_artifacts.get_s3_dir(bucket))\n  s3_path = os.path.join(aws_prow_artifacts.get_s3_dir(bucket) + \"/artifacts/build_bin/kfctl\")\n  aws_util.upload_file_to_s3(kfctl_path, s3_path)\n\ndef apply_kubeflow(kfctl_path, app_path):\n  util.run([kfctl_path, \"apply\", \"-V\", \"-f=\" + os.path.join(app_path, \"tmp.yaml\")], cwd=app_path)\n  return app_path\n\ndef build_and_apply_kubeflow(kfctl_path, app_path):\n  util.run([kfctl_path, \"build\", \"-V\", \"-f=\" + os.path.join(app_path, \"tmp.yaml\")], cwd=app_path)\n  util.run([kfctl_path, \"apply\", \"-V\", \"-f=\" + os.path.join(app_path, \"tmp.yaml\")], cwd=app_path)\n  return app_path\n\ndef upgrade_kubeflow(kfctl_path, parent_dir):\n  util.run([kfctl_path, \"apply\", \"-V\", \"-f=\" + os.path.join(parent_dir, \"upgrade.yaml\")], cwd=parent_dir)\n\ndef verify_kubeconfig(app_path):\n  \"\"\"Verify kubeconfig.\n\n  Args:\n    app_path: KfDef spec path\n  \"\"\"\n  name = os.path.basename(app_path)\n  context = util.run([\"kubectl\", \"config\", \"current-context\"]).strip()\n  if name == context:\n    logging.info(\"KUBECONFIG current context name matches app name: %s\", name)\n  else:\n    msg = \"KUBECONFIG not having expected context: {expected} v.s. {actual}\".format(\n      expected=name, actual=context)\n    logging.error(msg)\n    raise RuntimeError(msg)\n\ndef kfctl_upgrade_kubeflow(app_path, kfctl_path, upgrade_spec_path, use_basic_auth=False):\n  \"\"\"Upgrade kubeflow.\n\n  Args:\n  app_path: The path to the Kubeflow app to be upgraded.\n  kfctl_path: The path to the kfctl binary.\n  upgrade_spec_path: The path to the upgrade sepc.\n  use_basic_auth: True if we are using basic auth for GCP.\n  \"\"\"\n  if not os.path.exists(kfctl_path):\n    msg = \"kfctl Go binary not found: {path}\".format(path=kfctl_path)\n    logging.error(msg)\n    raise RuntimeError(msg)\n\n  app_path, parent_dir = get_or_create_app_path_and_parent_dir(app_path)\n  app_name = os.path.basename(app_path)\n\n  logging.info(\"app path %s\", app_path)\n  logging.info(\"app name %s\", app_name)\n  logging.info(\"parent dir %s\", parent_dir)\n  logging.info(\"kfctl path %s\", kfctl_path)\n\n  upgrade_spec = load_config(upgrade_spec_path)\n  upgrade_spec[\"spec\"][\"currentKfDef\"][\"name\"] = app_name\n  upgrade_spec[\"spec\"][\"newKfDef\"][\"name\"] = app_name\n\n  with open(os.path.join(parent_dir, \"upgrade.yaml\"), \"w\") as f:\n    yaml.dump(upgrade_spec, f)\n\n  # Set ENV for credentials IAP/basic auth needs.\n  set_env_for_auth(use_basic_auth)\n\n  # Write basic auth login username/password to a file for later tests.\n  # If the ENVs are not set, this function call will be noop.\n  write_basic_auth_login(os.path.join(app_path, \"login.json\"))\n\n  logging.info(\"switching working directory to: %s \\n\", parent_dir)\n  os.chdir(parent_dir)\n\n  # Run upgrade\n  logging.info(\"Running kfctl with upgrade spec:\\n%s\", yaml.safe_dump(upgrade_spec))\n  upgrade_kubeflow(kfctl_path, parent_dir)"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/run_with_retry.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\nrun_with_retry runs the given binary with the given number of retries\n\nThis is intended primary for retrying bash scripts. Ideally, we sould use\nargo's retryStrategy, but there is a bug in it's implementation:\nhttps://github.com/argoproj/argo/issues/885\n\nExample:\n  python run_with_retry --retries=5 -- bash my_flaky_script.sh\n\nThis runs bash my_flaky_script.sh upto 5 times till it succeeds\n\"\"\"\nimport argparse\nfrom kubeflow.testing import test_helper, util\nfrom retrying import retry\n\n\ndef parse_args():\n  parser = argparse.ArgumentParser()\n  parser.add_argument(\n      \"--retries\", required=True, type=int, help=\"The number of retries.\")\n\n  parser.add_argument('remaining_args', nargs=argparse.REMAINDER)\n  args, _ = parser.parse_known_args()\n  return args\n\n\ndef run_with_retry(_):\n  \"\"\"Deploy Kubeflow.\"\"\"\n  args = parse_args()\n\n  @retry(stop_max_attempt_number=args.retries)\n  def run():\n    util.run(args.remaining_args[1:])\n\n  run()\n\n\ndef main():\n  test_case = test_helper.TestCase(\n      name='run_with_retry', test_func=run_with_retry)\n  test_suite = test_helper.init(name='run_with_retry', test_cases=[test_case])\n  test_suite.run()\n\n\nif __name__ == \"__main__\":\n  main()\n"
  },
  {
    "path": "py/kubeflow/kfctl/testing/util/vm_util.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"Utilities for working with VMs as part of our tests.\"\"\"\n\nimport datetime\nimport logging\nimport os\nimport socket\nimport ssl\nimport subprocess\nimport time\nimport uuid\n\nfrom kubeflow.testing import util\n\n# TODO(jlewi): Should we move this to kubeflow/testing\n\n\ndef wait_for_operation(client,\n                       project,\n                       zone,\n                       op_id,\n                       timeout=datetime.timedelta(hours=1),\n                       polling_interval=datetime.timedelta(seconds=5)):\n  \"\"\"\n  Wait for the specified operation to complete.\n\n  Args:\n    client: Client for the API that owns the operation.\n    project: project\n    zone: Zone. Set to none if its a global operation\n    op_id: Operation id/name.\n    timeout: A datetime.timedelta expressing the amount of time to wait before\n        giving up.\n    polling_interval: A datetime.timedelta to represent the amount of time to\n        wait between requests polling for the operation status.\n\n  Returns:\n    op: The final operation.\n\n  Raises:\n    TimeoutError: if we timeout waiting for the operation to complete.\n  \"\"\"\n  endtime = datetime.datetime.now() + timeout\n  while True:\n    try:\n      if zone:\n        op = client.zoneOperations().get(\n            project=project, zone=zone, operation=op_id).execute()\n      else:\n        op = client.globalOperations().get(\n            project=project, operation=op_id).execute()\n    except socket.error as e:\n      logging.error(\"Ignoring error %s\", e)\n      continue\n    except ssl.SSLError as e:\n      logging.error(\"Ignoring error %s\", e)\n      continue\n    status = op.get(\"status\", \"\")\n    # Need to handle other status's\n    if status == \"DONE\":\n      return op\n    if datetime.datetime.now() > endtime:\n      raise TimeoutError(\n          \"Timed out waiting for op: {0} to complete.\".format(op_id))\n    time.sleep(polling_interval.total_seconds())\n\n\ndef wait_for_vm(project,\n                zone,\n                vm,\n                timeout=datetime.timedelta(minutes=5),\n                polling_interval=datetime.timedelta(seconds=10)):\n  \"\"\"\n  Wait for the VM to be ready. This is measured by trying to ssh into the VM\n\n  timeout: A datetime.timedelta expressing the amount of time to wait\n      before giving up.\n  polling_interval: A datetime.timedelta to represent the amount of time\n        to wait between requests polling for the operation status.\n  Raises:\n    TimeoutError: if we timeout waiting for the operation to complete.\n  \"\"\"\n  endtime = datetime.datetime.now() + timeout\n  while True:\n    try:\n      util.run([\n          \"gcloud\", \"compute\", \"--project=\" + project, \"ssh\", \"--zone=\" + zone,\n          vm, \"--\", \"echo hello world\"\n      ])\n      logging.info(\"VM is ready\")\n      return\n    except subprocess.CalledProcessError:\n      pass\n\n    if datetime.datetime.now() > endtime:\n      raise util.TimeoutError(\n          (\"Timed out waiting for VM to {0} be sshable. Check firewall\"\n           \"rules aren't blocking ssh.\").format(vm))\n\n    time.sleep(polling_interval.total_seconds())\n\n\ndef execute(project, zone, vm, commands):\n  \"\"\"Execute the supplied commands on the VM.\"\"\"\n  util.run([\n      \"gcloud\", \"compute\", \"--project=\" + project, \"ssh\", \"--zone=\" + zone, vm,\n      \"--\", \" && \".join(commands)\n  ])\n\n\ndef execute_script(project, zone, vm, script):\n  \"\"\"Execute the specified script on the VM.\"\"\"\n\n  target_path = os.path.join(\n      \"/tmp\",\n      os.path.basename(script) + \".\" + uuid.uuid4().hex[0:4])\n\n  target = \"{0}:{1}\".format(vm, target_path)\n  logging.info(\"Copying %s to %s\", script, target)\n  util.run([\n      \"gcloud\", \"compute\", \"--project=\" + project, \"scp\", script, target,\n      \"--zone=\" + zone\n  ])\n\n  util.run([\n      \"gcloud\", \"compute\", \"--project=\" + project, \"ssh\", \"--zone=\" + zone, vm,\n      \"--\", \"chmod a+rx \" + target_path + \" && \" + target_path\n  ])\n"
  },
  {
    "path": "third_party/README.md",
    "content": "This folder contains all licenses and source code of third-party dependencies for distributing kfctl tools.\n\nFor any dependency changes, please follow [this instruction](https://github.com/kubeflow/testing/blob/master/py/kubeflow/testing/go-license-tools/README.md) to update the content of this folder.\n\n- `dep.txt` contains third party Go dependencies based `go.mod`.\n- `license.txt` contains all license content of dependencies.\n- `license_info.csv` contains license URLs.\n"
  },
  {
    "path": "third_party/check-license.sh",
    "content": "#!/usr/bin/env bash\nset -ex\n# Copyright 2018 The Kubeflow Authors All rights reserved.\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# Script to autoformat libsonnet files.\n# Assumes jsonnet is on the path.\n\ngo list -m all | cut -d ' ' -f 1 > /tmp/generated_dep.txt\n\ncd third_party\n\nif ! diff /tmp/generated_dep.txt dep.txt; then\n    echo \"Please update the license file for changed dependencies.\"\n    exit 1\nfi\n\npython3 concatenate_license.py --output=/tmp/generated_license.txt\n\nif ! diff /tmp/generated_license.txt license.txt; then\n    echo \"Please regenerate third_party/license.txt.\"\n    exit 1\nfi\n"
  },
  {
    "path": "third_party/concatenate_license.py",
    "content": "# Copyright 2019 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 argparse\nimport requests\nimport sys\nimport traceback\n\nparser = argparse.ArgumentParser(\n  description='Generate dependencies json from license.csv file.')\nparser.add_argument(\n  'license_info_file',\n  nargs='?',\n  default='license_info.csv',\n  help='CSV file with license info fetched from github using get-github-license-info CLI tool.'\n    +'(default: %(default)s)',\n)\nparser.add_argument(\n  '-o',\n  '--output',\n  dest='output_file',\n  nargs='?',\n  default='license.txt',\n  help=\n  'Concatenated license file path this command generates. (default: %(default)s)'\n)\nargs = parser.parse_args()\n\n\ndef fetch_license_text(download_link):\n  response = requests.get(download_link)\n  assert response.ok, 'Fetching {} failed with {} {}'.format(\n    download_link, response.status_code, response.reason)\n  return response.text\n\n\ndef main():\n  with open(args.license_info_file,\n            'r') as license_info_file, open(args.output_file,\n                                            'w') as output_file:\n    repo_failed = []\n    for line in license_info_file:\n      line = line.strip()\n      [repo, license_link, license_name,\n        license_download_link] = line.split(',')\n      try:\n        print('Repo {} has license download link {}'.format(\n            repo, license_download_link),\n              file=sys.stderr)\n        license_text = fetch_license_text(license_download_link)\n        print(\n            '--------------------------------------------------------------------------------',\n            file=output_file,\n        )\n        print('{}  {}  {}'.format(repo, license_name, license_link),\n              file=output_file)\n        print(\n            '--------------------------------------------------------------------------------',\n            file=output_file,\n        )\n        print(license_text, file=output_file)\n      except Exception as e: # pylint: disable=broad-except\n        print('[failed]', e, file=sys.stderr)\n        traceback.print_exc(file=sys.stderr)\n        repo_failed.append(repo)\n    print('Failed to download license file for {} repos.'.format(len(repo_failed)), file=sys.stderr)\n    for repo in repo_failed:\n      print(repo, file=sys.stderr)\n\n\nmain()\n"
  },
  {
    "path": "third_party/dep.txt",
    "content": "github.com/kubeflow/kfctl/v3\nbitbucket.org/bertimus9/systemstat\ncloud.google.com/go\ngithub.com/Azure/azure-sdk-for-go\ngithub.com/Azure/go-ansiterm\ngithub.com/Azure/go-autorest\ngithub.com/BurntSushi/toml\ngithub.com/BurntSushi/xgb\ngithub.com/GoogleCloudPlatform/k8s-cloud-provider\ngithub.com/JeffAshton/win_pdh\ngithub.com/MakeNowJust/heredoc\ngithub.com/Microsoft/go-winio\ngithub.com/Microsoft/hcsshim\ngithub.com/NYTimes/gziphandler\ngithub.com/PuerkitoBio/purell\ngithub.com/PuerkitoBio/urlesc\ngithub.com/Rican7/retry\ngithub.com/Sirupsen/logrus\ngithub.com/alecthomas/template\ngithub.com/alecthomas/units\ngithub.com/armon/circbuf\ngithub.com/armon/consul-api\ngithub.com/asaskevich/govalidator\ngithub.com/auth0/go-jwt-middleware\ngithub.com/aws/aws-sdk-go\ngithub.com/bazelbuild/bazel-gazelle\ngithub.com/bazelbuild/buildtools\ngithub.com/beorn7/perks\ngithub.com/bgentry/go-netrc\ngithub.com/blang/semver\ngithub.com/boltdb/bolt\ngithub.com/cenkalti/backoff\ngithub.com/cespare/prettybench\ngithub.com/chai2010/gettext-go\ngithub.com/cheggaaa/pb\ngithub.com/client9/misspell\ngithub.com/cloudflare/cfssl\ngithub.com/clusterhq/flocker-go\ngithub.com/codedellemc/goscaleio\ngithub.com/codegangsta/negroni\ngithub.com/container-storage-interface/spec\ngithub.com/containerd/console\ngithub.com/containerd/containerd\ngithub.com/containerd/typeurl\ngithub.com/containernetworking/cni\ngithub.com/coreos/bbolt\ngithub.com/coreos/etcd\ngithub.com/coreos/go-etcd\ngithub.com/coreos/go-oidc\ngithub.com/coreos/go-semver\ngithub.com/coreos/go-systemd\ngithub.com/coreos/pkg\ngithub.com/coreos/rkt\ngithub.com/cpuguy83/go-md2man\ngithub.com/cyphar/filepath-securejoin\ngithub.com/d2g/dhcp4\ngithub.com/d2g/dhcp4client\ngithub.com/davecgh/go-spew\ngithub.com/daviddengcn/go-colortext\ngithub.com/deckarep/golang-set\ngithub.com/dgrijalva/jwt-go\ngithub.com/dnaeon/go-vcr\ngithub.com/docker/distribution\ngithub.com/docker/docker\ngithub.com/docker/go-connections\ngithub.com/docker/go-units\ngithub.com/docker/libnetwork\ngithub.com/docker/spdystream\ngithub.com/elazarl/goproxy\ngithub.com/elazarl/goproxy/ext\ngithub.com/emicklei/go-restful\ngithub.com/euank/go-kmsg-parser\ngithub.com/evanphx/json-patch\ngithub.com/exponent-io/jsonpath\ngithub.com/fatih/camelcase\ngithub.com/fatih/color\ngithub.com/fsnotify/fsnotify\ngithub.com/ghodss/yaml\ngithub.com/globalsign/mgo\ngithub.com/go-kit/kit\ngithub.com/go-logfmt/logfmt\ngithub.com/go-logr/logr\ngithub.com/go-logr/zapr\ngithub.com/go-openapi/analysis\ngithub.com/go-openapi/errors\ngithub.com/go-openapi/jsonpointer\ngithub.com/go-openapi/jsonreference\ngithub.com/go-openapi/loads\ngithub.com/go-openapi/runtime\ngithub.com/go-openapi/spec\ngithub.com/go-openapi/strfmt\ngithub.com/go-openapi/swag\ngithub.com/go-openapi/validate\ngithub.com/go-ozzo/ozzo-validation\ngithub.com/go-stack/stack\ngithub.com/godbus/dbus\ngithub.com/gogo/protobuf\ngithub.com/golang/glog\ngithub.com/golang/groupcache\ngithub.com/golang/mock\ngithub.com/golang/protobuf\ngithub.com/golangplus/bytes\ngithub.com/golangplus/fmt\ngithub.com/golangplus/testing\ngithub.com/google/btree\ngithub.com/google/cadvisor\ngithub.com/google/certificate-transparency-go\ngithub.com/google/go-cmp\ngithub.com/google/gofuzz\ngithub.com/google/martian\ngithub.com/google/pprof\ngithub.com/google/renameio\ngithub.com/google/uuid\ngithub.com/googleapis/gax-go/v2\ngithub.com/googleapis/gnostic\ngithub.com/gophercloud/gophercloud\ngithub.com/gopherjs/gopherjs\ngithub.com/gorilla/context\ngithub.com/gorilla/mux\ngithub.com/gorilla/websocket\ngithub.com/gregjones/httpcache\ngithub.com/grpc-ecosystem/go-grpc-middleware\ngithub.com/grpc-ecosystem/go-grpc-prometheus\ngithub.com/grpc-ecosystem/grpc-gateway\ngithub.com/hashicorp/go-cleanhttp\ngithub.com/hashicorp/go-getter\ngithub.com/hashicorp/go-safetemp\ngithub.com/hashicorp/go-version\ngithub.com/hashicorp/golang-lru\ngithub.com/hashicorp/hcl\ngithub.com/heketi/heketi\ngithub.com/heketi/rest\ngithub.com/heketi/tests\ngithub.com/heketi/utils\ngithub.com/hpcloud/tail\ngithub.com/imdario/mergo\ngithub.com/inconshreveable/mousetrap\ngithub.com/jmespath/go-jmespath\ngithub.com/jonboulle/clockwork\ngithub.com/json-iterator/go\ngithub.com/jstemmer/go-junit-report\ngithub.com/jteeuwen/go-bindata\ngithub.com/jtolds/gls\ngithub.com/julienschmidt/httprouter\ngithub.com/kardianos/osext\ngithub.com/karrick/godirwalk\ngithub.com/kisielk/errcheck\ngithub.com/kisielk/gotool\ngithub.com/konsorten/go-windows-terminal-sequences\ngithub.com/kr/fs\ngithub.com/kr/logfmt\ngithub.com/kr/pretty\ngithub.com/kr/pty\ngithub.com/kr/text\ngithub.com/kubernetes-sigs/application\ngithub.com/libopenstorage/openstorage\ngithub.com/liggitt/tabwriter\ngithub.com/lithammer/dedent\ngithub.com/lpabon/godbc\ngithub.com/magiconair/properties\ngithub.com/mailru/easyjson\ngithub.com/marstr/guid\ngithub.com/mattn/go-colorable\ngithub.com/mattn/go-isatty\ngithub.com/mattn/go-runewidth\ngithub.com/mattn/go-shellwords\ngithub.com/matttproud/golang_protobuf_extensions\ngithub.com/mesos/mesos-go\ngithub.com/mholt/caddy\ngithub.com/miekg/dns\ngithub.com/mindprince/gonvml\ngithub.com/mistifyio/go-zfs\ngithub.com/mitchellh/go-homedir\ngithub.com/mitchellh/go-testing-interface\ngithub.com/mitchellh/go-wordwrap\ngithub.com/mitchellh/mapstructure\ngithub.com/modern-go/concurrent\ngithub.com/modern-go/reflect2\ngithub.com/mohae/deepcopy\ngithub.com/morikuni/aec\ngithub.com/mrunalp/fileutils\ngithub.com/munnerz/goautoneg\ngithub.com/mvdan/xurls\ngithub.com/mwitkow/go-conntrack\ngithub.com/mxk/go-flowrate\ngithub.com/natefinch/lumberjack\ngithub.com/onrik/logrus\ngithub.com/onsi/ginkgo\ngithub.com/onsi/gomega\ngithub.com/opencontainers/go-digest\ngithub.com/opencontainers/image-spec\ngithub.com/opencontainers/runc\ngithub.com/opencontainers/runtime-spec\ngithub.com/opencontainers/selinux\ngithub.com/otiai10/copy\ngithub.com/otiai10/curr\ngithub.com/otiai10/mint\ngithub.com/pborman/uuid\ngithub.com/pelletier/go-toml\ngithub.com/peterbourgon/diskv\ngithub.com/pkg/errors\ngithub.com/pkg/sftp\ngithub.com/pmezard/go-difflib\ngithub.com/pquerna/cachecontrol\ngithub.com/pquerna/ffjson\ngithub.com/prometheus/client_golang\ngithub.com/prometheus/client_model\ngithub.com/prometheus/common\ngithub.com/prometheus/procfs\ngithub.com/quobyte/api\ngithub.com/remyoudompheng/bigfft\ngithub.com/robfig/cron\ngithub.com/rogpeppe/go-charset\ngithub.com/rogpeppe/go-internal\ngithub.com/rubiojr/go-vhd\ngithub.com/russross/blackfriday\ngithub.com/satori/go.uuid\ngithub.com/seccomp/libseccomp-golang\ngithub.com/shurcooL/sanitized_anchor_name\ngithub.com/sigma/go-inotify\ngithub.com/sirupsen/logrus\ngithub.com/smartystreets/assertions\ngithub.com/smartystreets/goconvey\ngithub.com/soheilhy/cmux\ngithub.com/spf13/afero\ngithub.com/spf13/cast\ngithub.com/spf13/cobra\ngithub.com/spf13/jwalterweatherman\ngithub.com/spf13/pflag\ngithub.com/spf13/viper\ngithub.com/storageos/go-api\ngithub.com/stretchr/objx\ngithub.com/stretchr/testify\ngithub.com/syndtr/gocapability\ngithub.com/tmc/grpc-websocket-proxy\ngithub.com/ugorji/go/codec\ngithub.com/ulikunitz/xz\ngithub.com/urfave/negroni\ngithub.com/vishvananda/netlink\ngithub.com/vishvananda/netns\ngithub.com/vmware/govmomi\ngithub.com/vmware/photon-controller-go-sdk\ngithub.com/xanzy/go-cloudstack\ngithub.com/xiang90/probing\ngithub.com/xlab/handysort\ngithub.com/xordataexchange/crypt\ngo.opencensus.io\ngo.uber.org/atomic\ngo.uber.org/multierr\ngo.uber.org/tools\ngo.uber.org/zap\ngolang.org/x/crypto\ngolang.org/x/exp\ngolang.org/x/image\ngolang.org/x/lint\ngolang.org/x/mobile\ngolang.org/x/mod\ngolang.org/x/net\ngolang.org/x/oauth2\ngolang.org/x/sync\ngolang.org/x/sys\ngolang.org/x/text\ngolang.org/x/time\ngolang.org/x/tools\ngolang.org/x/xerrors\ngomodules.xyz/jsonpatch/v2\ngonum.org/v1/gonum\ngonum.org/v1/netlib\ngoogle.golang.org/api\ngoogle.golang.org/appengine\ngoogle.golang.org/genproto\ngoogle.golang.org/grpc\ngopkg.in/airbrake/gobrake.v2\ngopkg.in/alecthomas/kingpin.v2\ngopkg.in/check.v1\ngopkg.in/cheggaaa/pb.v1\ngopkg.in/errgo.v2\ngopkg.in/fsnotify.v1\ngopkg.in/gcfg.v1\ngopkg.in/gemnasium/logrus-airbrake-hook.v2\ngopkg.in/inf.v0\ngopkg.in/natefinch/lumberjack.v2\ngopkg.in/square/go-jose.v2\ngopkg.in/tomb.v1\ngopkg.in/warnings.v0\ngopkg.in/yaml.v1\ngopkg.in/yaml.v2\ngotest.tools\nhonnef.co/go/tools\nk8s.io/api\nk8s.io/apiextensions-apiserver\nk8s.io/apimachinery\nk8s.io/apiserver\nk8s.io/cli-runtime\nk8s.io/client-go\nk8s.io/cloud-provider\nk8s.io/cluster-bootstrap\nk8s.io/code-generator\nk8s.io/component-base\nk8s.io/cri-api\nk8s.io/csi-translation-lib\nk8s.io/gengo\nk8s.io/heapster\nk8s.io/klog\nk8s.io/kube-aggregator\nk8s.io/kube-controller-manager\nk8s.io/kube-openapi\nk8s.io/kube-proxy\nk8s.io/kube-scheduler\nk8s.io/kubelet\nk8s.io/kubernetes\nk8s.io/legacy-cloud-providers\nk8s.io/metrics\nk8s.io/repo-infra\nk8s.io/sample-apiserver\nk8s.io/utils\nmodernc.org/cc\nmodernc.org/golex\nmodernc.org/mathutil\nmodernc.org/strutil\nmodernc.org/xc\nsigs.k8s.io/controller-runtime\nsigs.k8s.io/kustomize\nsigs.k8s.io/kustomize/v3\nsigs.k8s.io/structured-merge-diff\nsigs.k8s.io/testing_frameworks\nsigs.k8s.io/yaml\nvbom.ml/util\n"
  },
  {
    "path": "third_party/dep_repo.manual.csv",
    "content": "gomodules.xyz/jsonpatch/v2,gomodules/jsonpatch\nhonnef.co/go/tools,dominikh/go-tools\nk8s.io/repo-infra,kubernetes/repo-infra\nsigs.k8s.io/kustomize/v3,kubernetes-sigs/kustomize\n"
  },
  {
    "path": "third_party/license.txt",
    "content": "--------------------------------------------------------------------------------\nkubeflow/kfctl  Apache License 2.0  https://github.com/kubeflow/kfctl/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nGoogleCloudPlatform/gcloud-golang  Apache License 2.0  https://github.com/googleapis/google-cloud-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nAzure/azure-sdk-for-go  Apache License 2.0  https://github.com/Azure/azure-sdk-for-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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 2016 Microsoft Corporation\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--------------------------------------------------------------------------------\nAzure/go-ansiterm  MIT License  https://github.com/Azure/go-ansiterm/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nAzure/go-autorest  Apache License 2.0  https://github.com/Azure/go-autorest/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2015 Microsoft Corporation\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--------------------------------------------------------------------------------\nBurntSushi/toml  MIT License  https://github.com/BurntSushi/toml/blob/master/COPYING\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 TOML authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nBurntSushi/xgb  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/BurntSushi/xgb/blob/master/LICENSE\n--------------------------------------------------------------------------------\n// Copyright (c) 2009 The XGB Authors. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//    * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//    * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Subject to the terms and conditions of this License, Google hereby\n// grants to You a perpetual, worldwide, non-exclusive, no-charge,\n// royalty-free, irrevocable (except as stated in this section) patent\n// license to make, have made, use, offer to sell, sell, import, and\n// otherwise transfer this implementation of XGB, where such license\n// applies only to those patent claims licensable by Google that are\n// necessarily infringed by use of this implementation of XGB. If You\n// institute patent litigation against any entity (including a\n// cross-claim or counterclaim in a lawsuit) alleging that this\n// implementation of XGB or a Contribution incorporated within this\n// implementation of XGB constitutes direct or contributory patent\n// infringement, then any patent licenses granted to You under this\n// License for this implementation of XGB shall terminate as of the date\n// such litigation is filed.\n\n--------------------------------------------------------------------------------\nGoogleCloudPlatform/k8s-cloud-provider  Apache License 2.0  https://github.com/GoogleCloudPlatform/k8s-cloud-provider/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nJeffAshton/win_pdh  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/JeffAshton/win_pdh/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2010 The win_pdh Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n3. The names of the authors may not be used to endorse or promote products\n   derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nMakeNowJust/heredoc  MIT License  https://github.com/MakeNowJust/heredoc/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014-2019 TSUYUSATO Kitsune\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nMicrosoft/go-winio  MIT License  https://github.com/microsoft/go-winio/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Microsoft\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n--------------------------------------------------------------------------------\nMicrosoft/hcsshim  MIT License  https://github.com/microsoft/hcsshim/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Microsoft\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\nNYTimes/gziphandler  Apache License 2.0  https://github.com/nytimes/gziphandler/blob/master/LICENSE\n--------------------------------------------------------------------------------\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 2016-2017 The New York Times Company\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--------------------------------------------------------------------------------\nPuerkitoBio/purell  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/PuerkitoBio/purell/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012, Martin Angers\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nPuerkitoBio/urlesc  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/PuerkitoBio/urlesc/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nRican7/retry  MIT License  https://github.com/Rican7/retry/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (C) 2016 Trevor N. Suarez (Rican7)\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\nOR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nSirupsen/logrus  MIT License  https://github.com/sirupsen/logrus/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Simon Eskildsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nalecthomas/template  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/alecthomas/template/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nalecthomas/units  MIT License  https://github.com/alecthomas/units/blob/master/COPYING\n--------------------------------------------------------------------------------\nCopyright (C) 2014 Alec Thomas\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nappscode/jsonpatch  Apache License 2.0  https://github.com/gomodules/jsonpatch/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n\n--------------------------------------------------------------------------------\narmon/circbuf  MIT License  https://github.com/armon/circbuf/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 Armon Dadgar\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\narmon/consul-api  Mozilla Public License 2.0  https://github.com/armon/consul-api/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. \"Contributor\"\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n\n     means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the terms of\n        a Secondary License.\n\n1.6. \"Executable Form\"\n\n     means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n\n     means a work that combines Covered Software with other material, in a\n     separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n\n     means this document.\n\n1.9. \"Licensable\"\n\n     means having the right to grant, to the maximum extent possible, whether\n     at the time of the initial grant or subsequently, any and all of the\n     rights conveyed by this License.\n\n1.10. \"Modifications\"\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. \"Patent Claims\" of a Contributor\n\n      means any patent claim(s), including without limitation, method,\n      process, and apparatus claims, in any patent Licensable by such\n      Contributor that would be infringed, but for the grant of the License,\n      by the making, using, selling, offering for sale, having made, import,\n      or transfer of either its Contributions or its Contributor Version.\n\n1.12. \"Secondary License\"\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. \"Source Code Form\"\n\n      means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, \"You\" includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, \"control\" means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or\n        as part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its\n        Contributions or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution\n     become effective for each Contribution on the date the Contributor first\n     distributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under\n     this License. No additional rights or licenses will be implied from the\n     distribution or licensing of Covered Software under this License.\n     Notwithstanding Section 2.1(b) above, no patent license is granted by a\n     Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party's\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of\n        its Contributions.\n\n     This License does not grant any rights in the trademarks, service marks,\n     or logos of any Contributor (except as may be necessary to comply with\n     the notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this\n     License (see Section 10.2) or under the terms of a Secondary License (if\n     permitted under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its\n     Contributions are its original creation(s) or it has sufficient rights to\n     grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under\n     applicable copyright doctrines of fair use, fair dealing, or other\n     equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under\n     the terms of this License. You must inform recipients that the Source\n     Code Form of the Covered Software is governed by the terms of this\n     License, and how they can obtain a copy of this License. You may not\n     attempt to alter or restrict the recipients' rights in the Source Code\n     Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this\n        License, or sublicense it under different terms, provided that the\n        license for the Executable Form does not attempt to limit or alter the\n        recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for\n     the Covered Software. If the Larger Work is a combination of Covered\n     Software with a work governed by one or more Secondary Licenses, and the\n     Covered Software is not Incompatible With Secondary Licenses, this\n     License permits You to additionally distribute such Covered Software\n     under the terms of such Secondary License(s), so that the recipient of\n     the Larger Work may, at their option, further distribute the Covered\n     Software under the terms of either this License or such Secondary\n     License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices\n     (including copyright notices, patent notices, disclaimers of warranty, or\n     limitations of liability) contained within the Source Code Form of the\n     Covered Software, except that You may alter any license notices to the\n     extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on\n     behalf of any Contributor. You must make it absolutely clear that any\n     such warranty, support, indemnity, or liability obligation is offered by\n     You alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute,\n   judicial order, or regulation then You must: (a) comply with the terms of\n   this License to the maximum extent possible; and (b) describe the\n   limitations and the code they affect. Such description must be placed in a\n   text file included with all distributions of the Covered Software under\n   this License. Except to the extent prohibited by statute or regulation,\n   such description must be sufficiently detailed for a recipient of ordinary\n   skill to be able to understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing\n     basis, if such Contributor fails to notify You of the non-compliance by\n     some reasonable means prior to 60 days after You have come back into\n     compliance. Moreover, Your grants from a particular Contributor are\n     reinstated on an ongoing basis if such Contributor notifies You of the\n     non-compliance by some reasonable means, this is the first time You have\n     received notice of non-compliance with this License from such\n     Contributor, and You become compliant prior to 30 days after Your receipt\n     of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions,\n     counter-claims, and cross-claims) alleging that a Contributor Version\n     directly or indirectly infringes any patent, then the rights granted to\n     You by any and all Contributors for the Covered Software under Section\n     2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an \"as is\" basis,\n   without warranty of any kind, either expressed, implied, or statutory,\n   including, without limitation, warranties that the Covered Software is free\n   of defects, merchantable, fit for a particular purpose or non-infringing.\n   The entire risk as to the quality and performance of the Covered Software\n   is with You. Should any Covered Software prove defective in any respect,\n   You (not any Contributor) assume the cost of any necessary servicing,\n   repair, or correction. This disclaimer of warranty constitutes an essential\n   part of this License. No use of  any Covered Software is authorized under\n   this License except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from\n   such party's negligence to the extent applicable law prohibits such\n   limitation. Some jurisdictions do not allow the exclusion or limitation of\n   incidental or consequential damages, so this exclusion and limitation may\n   not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts\n   of a jurisdiction where the defendant maintains its principal place of\n   business and such litigation shall be governed by laws of that\n   jurisdiction, without reference to its conflict-of-law provisions. Nothing\n   in this Section shall prevent a party's ability to bring cross-claims or\n   counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject\n   matter hereof. If any provision of this License is held to be\n   unenforceable, such provision shall be reformed only to the extent\n   necessary to make it enforceable. Any law or regulation which provides that\n   the language of a contract shall be construed against the drafter shall not\n   be used to construe this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version\n      of the License under which You originally received the Covered Software,\n      or under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a\n      modified version of this License if you rename the license and remove\n      any references to the name of the license steward (except to note that\n      such modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\n      Licenses If You choose to distribute Source Code Form that is\n      Incompatible With Secondary Licenses under the terms of this version of\n      the License, the notice described in Exhibit B of this License must be\n      attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file,\nthen You may include the notice in a location (such as a LICENSE file in a\nrelevant directory) where a recipient would be likely to look for such a\nnotice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n\n      This Source Code Form is \"Incompatible\n      With Secondary Licenses\", as defined by\n      the Mozilla Public License, v. 2.0.\n--------------------------------------------------------------------------------\nasaskevich/govalidator  MIT License  https://github.com/asaskevich/govalidator/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Alex Saskevich\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\nauth0/go-jwt-middleware  MIT License  https://github.com/auth0/go-jwt-middleware/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n \nCopyright (c) 2015 Auth0, Inc. <support@auth0.com> (http://auth0.com)\n \nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n \nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n \nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\naws/aws-sdk-go  Apache License 2.0  https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nbazelbuild/bazel-gazelle  Apache License 2.0  https://github.com/bazelbuild/bazel-gazelle/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nbazelbuild/buildtools  Apache License 2.0  https://github.com/bazelbuild/buildtools/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2016 Google Inc. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n--------------------------------------------------------------------------------\nbeorn7/perks  MIT License  https://github.com/beorn7/perks/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (C) 2013 Blake Mizerany\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nbgentry/go-netrc  MIT License  https://github.com/bgentry/go-netrc/blob/master/LICENSE\n--------------------------------------------------------------------------------\nOriginal version Copyright © 2010 Fazlul Shahriar <fshahriar@gmail.com>. Newer\nportions Copyright © 2014 Blake Gentry <blakesgentry@gmail.com>.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nblang/semver  MIT License  https://github.com/blang/semver/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License\n\nCopyright (c) 2014 Benedikt Lang <github at benediktlang.de>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n--------------------------------------------------------------------------------\nboltdb/bolt  MIT License  https://github.com/boltdb/bolt/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 Ben Johnson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\ncenkalti/backoff  MIT License  https://github.com/cenkalti/backoff/blob/v4/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Cenk Altı\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\ncespare/prettybench  MIT License  https://github.com/cespare/prettybench/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nCopyright (c) 2014 Caleb Spare\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nchai2010/gettext-go  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/chai2010/gettext-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ncheggaaa/pb  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/cheggaaa/pb/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012-2015, Sergey Cherepanov\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n--------------------------------------------------------------------------------\nclient9/misspell  MIT License  https://github.com/client9/misspell/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017 Nick Galbreath\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n--------------------------------------------------------------------------------\ncloudflare/cfssl  BSD 2-Clause \"Simplified\" License  https://github.com/cloudflare/cfssl/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2014 CloudFlare Inc.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\nRedistributions of source code must retain the above copyright notice,\nthis list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nclusterhq/flocker-go  Apache License 2.0  https://github.com/ClusterHQ/flocker-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\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   Copyright 2014-2016 ClusterHQ\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--------------------------------------------------------------------------------\ncodedellemc/goscaleio  Apache License 2.0  https://github.com/thecodeteam/goscaleio/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n\n--------------------------------------------------------------------------------\ncodegangsta/negroni  MIT License  https://github.com/urfave/negroni/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jeremy Saenz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\ncontainer-storage-interface/spec  Apache License 2.0  https://github.com/container-storage-interface/spec/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\ncontainerd/console  Apache License 2.0  https://github.com/containerd/console/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://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   Copyright The containerd Authors\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       https://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--------------------------------------------------------------------------------\ncontainerd/containerd  Apache License 2.0  https://github.com/containerd/containerd/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://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   Copyright The containerd Authors\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       https://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--------------------------------------------------------------------------------\ncontainerd/typeurl  Apache License 2.0  https://github.com/containerd/typeurl/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://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   Copyright The containerd Authors\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       https://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--------------------------------------------------------------------------------\ncontainernetworking/cni  Apache License 2.0  https://github.com/containernetworking/cni/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n\n--------------------------------------------------------------------------------\ncoreos/bbolt  MIT License  https://github.com/etcd-io/bbolt/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 Ben Johnson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\ncoreos/etcd  Apache License 2.0  https://github.com/etcd-io/etcd/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ncoreos/go-etcd  Apache License 2.0  https://github.com/coreos/go-etcd/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ncoreos/go-oidc  Apache License 2.0  https://github.com/coreos/go-oidc/blob/v2/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n\n--------------------------------------------------------------------------------\ncoreos/go-semver  Apache License 2.0  https://github.com/coreos/go-semver/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ncoreos/go-systemd  Apache License 2.0  https://github.com/coreos/go-systemd/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-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\n--------------------------------------------------------------------------------\ncoreos/pkg  Apache License 2.0  https://github.com/coreos/pkg/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n\n--------------------------------------------------------------------------------\ncoreos/rkt  Apache License 2.0  https://github.com/rkt/rkt/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n--------------------------------------------------------------------------------\ncpuguy83/go-md2man  MIT License  https://github.com/cpuguy83/go-md2man/blob/master/LICENSE.md\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Brian Goff\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\ncyphar/filepath-securejoin  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/cyphar/filepath-securejoin/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (C) 2014-2015 Docker Inc & Go Authors. All rights reserved.\nCopyright (C) 2017 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nd2g/dhcp4  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/d2g/dhcp4/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013 Skagerrak Software Limited. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Skagerrak Software Limited nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n--------------------------------------------------------------------------------\nd2g/dhcp4client  Mozilla Public License 2.0  https://github.com/d2g/dhcp4client/blob/v1/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. “Contributor”\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. “Contributor Version”\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor’s Contribution.\n\n1.3. “Contribution”\n\n     means Covered Software of a particular Contributor.\n\n1.4. “Covered Software”\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. “Incompatible With Secondary Licenses”\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of version\n        1.1 or earlier of the License, but not also under the terms of a\n        Secondary License.\n\n1.6. “Executable Form”\n\n     means any form of the work other than Source Code Form.\n\n1.7. “Larger Work”\n\n     means a work that combines Covered Software with other material, in a separate\n     file or files, that is not Covered Software.\n\n1.8. “License”\n\n     means this document.\n\n1.9. “Licensable”\n\n     means having the right to grant, to the maximum extent possible, whether at the\n     time of the initial grant or subsequently, any and all of the rights conveyed by\n     this License.\n\n1.10. “Modifications”\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to, deletion\n        from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. “Patent Claims” of a Contributor\n\n      means any patent claim(s), including without limitation, method, process,\n      and apparatus claims, in any patent Licensable by such Contributor that\n      would be infringed, but for the grant of the License, by the making,\n      using, selling, offering for sale, having made, import, or transfer of\n      either its Contributions or its Contributor Version.\n\n1.12. “Secondary License”\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. “Source Code Form”\n\n      means the form of the work preferred for making modifications.\n\n1.14. “You” (or “Your”)\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, “You” includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, “control” means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or as\n        part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its Contributions\n        or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution become\n     effective for each Contribution on the date the Contributor first distributes\n     such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under this\n     License. No additional rights or licenses will be implied from the distribution\n     or licensing of Covered Software under this License. Notwithstanding Section\n     2.1(b) above, no patent license is granted by a Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party’s\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of its\n        Contributions.\n\n     This License does not grant any rights in the trademarks, service marks, or\n     logos of any Contributor (except as may be necessary to comply with the\n     notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this License\n     (see Section 10.2) or under the terms of a Secondary License (if permitted\n     under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its Contributions\n     are its original creation(s) or it has sufficient rights to grant the\n     rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under applicable\n     copyright doctrines of fair use, fair dealing, or other equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under the\n     terms of this License. You must inform recipients that the Source Code Form\n     of the Covered Software is governed by the terms of this License, and how\n     they can obtain a copy of this License. You may not attempt to alter or\n     restrict the recipients’ rights in the Source Code Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this License,\n        or sublicense it under different terms, provided that the license for\n        the Executable Form does not attempt to limit or alter the recipients’\n        rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for the\n     Covered Software. If the Larger Work is a combination of Covered Software\n     with a work governed by one or more Secondary Licenses, and the Covered\n     Software is not Incompatible With Secondary Licenses, this License permits\n     You to additionally distribute such Covered Software under the terms of\n     such Secondary License(s), so that the recipient of the Larger Work may, at\n     their option, further distribute the Covered Software under the terms of\n     either this License or such Secondary License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices (including\n     copyright notices, patent notices, disclaimers of warranty, or limitations\n     of liability) contained within the Source Code Form of the Covered\n     Software, except that You may alter any license notices to the extent\n     required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on behalf\n     of any Contributor. You must make it absolutely clear that any such\n     warranty, support, indemnity, or liability obligation is offered by You\n     alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute, judicial\n   order, or regulation then You must: (a) comply with the terms of this License\n   to the maximum extent possible; and (b) describe the limitations and the code\n   they affect. Such description must be placed in a text file included with all\n   distributions of the Covered Software under this License. Except to the\n   extent prohibited by statute or regulation, such description must be\n   sufficiently detailed for a recipient of ordinary skill to be able to\n   understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing basis,\n     if such Contributor fails to notify You of the non-compliance by some\n     reasonable means prior to 60 days after You have come back into compliance.\n     Moreover, Your grants from a particular Contributor are reinstated on an\n     ongoing basis if such Contributor notifies You of the non-compliance by\n     some reasonable means, this is the first time You have received notice of\n     non-compliance with this License from such Contributor, and You become\n     compliant prior to 30 days after Your receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions, counter-claims,\n     and cross-claims) alleging that a Contributor Version directly or\n     indirectly infringes any patent, then the rights granted to You by any and\n     all Contributors for the Covered Software under Section 2.1 of this License\n     shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an “as is” basis, without\n   warranty of any kind, either expressed, implied, or statutory, including,\n   without limitation, warranties that the Covered Software is free of defects,\n   merchantable, fit for a particular purpose or non-infringing. The entire\n   risk as to the quality and performance of the Covered Software is with You.\n   Should any Covered Software prove defective in any respect, You (not any\n   Contributor) assume the cost of any necessary servicing, repair, or\n   correction. This disclaimer of warranty constitutes an essential part of this\n   License. No use of  any Covered Software is authorized under this License\n   except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from such\n   party’s negligence to the extent applicable law prohibits such limitation.\n   Some jurisdictions do not allow the exclusion or limitation of incidental or\n   consequential damages, so this exclusion and limitation may not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts of\n   a jurisdiction where the defendant maintains its principal place of business\n   and such litigation shall be governed by laws of that jurisdiction, without\n   reference to its conflict-of-law provisions. Nothing in this Section shall\n   prevent a party’s ability to bring cross-claims or counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject matter\n   hereof. If any provision of this License is held to be unenforceable, such\n   provision shall be reformed only to the extent necessary to make it\n   enforceable. Any law or regulation which provides that the language of a\n   contract shall be construed against the drafter shall not be used to construe\n   this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version of\n      the License under which You originally received the Covered Software, or\n      under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a modified\n      version of this License if you rename the license and remove any\n      references to the name of the license steward (except to note that such\n      modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses\n      If You choose to distribute Source Code Form that is Incompatible With\n      Secondary Licenses under the terms of this version of the License, the\n      notice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file, then\nYou may include the notice in a location (such as a LICENSE file in a relevant\ndirectory) where a recipient would be likely to look for such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - “Incompatible With Secondary Licenses” Notice\n\n      This Source Code Form is “Incompatible\n      With Secondary Licenses”, as defined by\n      the Mozilla Public License, v. 2.0.\n\n\n--------------------------------------------------------------------------------\ndavecgh/go-spew  ISC License  https://github.com/davecgh/go-spew/blob/master/LICENSE\n--------------------------------------------------------------------------------\nISC License\n\nCopyright (c) 2012-2016 Dave Collins <dave@davec.name>\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n--------------------------------------------------------------------------------\ndaviddengcn/go-colortext  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/daviddengcn/go-colortext/blob/master/LICENSE\n--------------------------------------------------------------------------------\nBSD License\n===========\n\nCopyright (c) 2016, David Deng\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of go-colortext nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\nMIT License\n===========\n\nCopyright (c) 2016 David Deng\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\ndeckarep/golang-set  MIT License  https://github.com/deckarep/golang-set/blob/master/LICENSE\n--------------------------------------------------------------------------------\nOpen Source Initiative OSI - The MIT License (MIT):Licensing\n\nThe MIT License (MIT)\nCopyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\ndgrijalva/jwt-go  MIT License  https://github.com/dgrijalva/jwt-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 Dave Grijalva\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n--------------------------------------------------------------------------------\ndnaeon/go-vcr  BSD 2-Clause \"Simplified\" License  https://github.com/dnaeon/go-vcr/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2015-2016 Marin Atanasov Nikolov <dnaeon@gmail.com>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n 1. Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer\n    in this position and unchanged.\n 2. Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ndocker/distribution  Apache License 2.0  https://github.com/docker/distribution/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n\n--------------------------------------------------------------------------------\ndocker/docker  Apache License 2.0  https://github.com/moby/moby/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://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   Copyright 2013-2018 Docker, Inc.\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       https://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--------------------------------------------------------------------------------\ndocker/go-connections  Apache License 2.0  https://github.com/docker/go-connections/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://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   Copyright 2015 Docker, Inc.\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       https://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--------------------------------------------------------------------------------\ndocker/go-units  Apache License 2.0  https://github.com/docker/go-units/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://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   Copyright 2015 Docker, Inc.\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       https://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--------------------------------------------------------------------------------\ndocker/libnetwork  Apache License 2.0  https://github.com/docker/libnetwork/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n\n--------------------------------------------------------------------------------\ndocker/spdystream  Apache License 2.0  https://github.com/docker/spdystream/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2014-2015 Docker, Inc.\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--------------------------------------------------------------------------------\nelazarl/goproxy  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/elazarl/goproxy/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 Elazar Leibovich. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Elazar Leibovich. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nemicklei/go-restful  MIT License  https://github.com/emicklei/go-restful/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012,2013 Ernest Micklei\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n--------------------------------------------------------------------------------\neuank/go-kmsg-parser  Apache License 2.0  https://github.com/euank/go-kmsg-parser/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nexponent-io/jsonpath  MIT License  https://github.com/exponent-io/jsonpath/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Exponent Labs LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nfatih/camelcase  MIT License  https://github.com/fatih/camelcase/blob/master/LICENSE.md\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Fatih Arslan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nfatih/color  MIT License  https://github.com/fatih/color/blob/master/LICENSE.md\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 Fatih Arslan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nfsnotify/fsnotify  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/fsnotify/fsnotify/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 The Go Authors. All rights reserved.\nCopyright (c) 2012-2019 fsnotify Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nghodss/yaml  MIT License  https://github.com/ghodss/yaml/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Sam Ghods\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nglobalsign/mgo  BSD 2-Clause \"Simplified\" License  https://github.com/globalsign/mgo/blob/master/LICENSE\n--------------------------------------------------------------------------------\nmgo - MongoDB driver for Go\n\nCopyright (c) 2010-2013 - Gustavo Niemeyer <gustavo@niemeyer.net>\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met: \n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer. \n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngo-kit/kit  MIT License  https://github.com/go-kit/kit/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Peter Bourgon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n--------------------------------------------------------------------------------\ngo-logfmt/logfmt  MIT License  https://github.com/go-logfmt/logfmt/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 go-logfmt\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n--------------------------------------------------------------------------------\ngo-logr/logr  Apache License 2.0  https://github.com/go-logr/logr/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\ngo-logr/zapr  Apache License 2.0  https://github.com/go-logr/zapr/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\ngo-openapi/analysis  Apache License 2.0  https://github.com/go-openapi/analysis/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/errors  Apache License 2.0  https://github.com/go-openapi/errors/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/jsonpointer  Apache License 2.0  https://github.com/go-openapi/jsonpointer/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/jsonreference  Apache License 2.0  https://github.com/go-openapi/jsonreference/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/loads  Apache License 2.0  https://github.com/go-openapi/loads/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/runtime  Apache License 2.0  https://github.com/go-openapi/runtime/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/spec  Apache License 2.0  https://github.com/go-openapi/spec/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/strfmt  Apache License 2.0  https://github.com/go-openapi/strfmt/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/swag  Apache License 2.0  https://github.com/go-openapi/swag/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-openapi/validate  Apache License 2.0  https://github.com/go-openapi/validate/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngo-ozzo/ozzo-validation  MIT License  https://github.com/go-ozzo/ozzo-validation/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\nCopyright (c) 2016, Qiang Xue\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software\nand associated documentation files (the \"Software\"), to deal in the Software without restriction,\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute,\nsublicense, and/or sell copies of the Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or\nsubstantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\nBUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\ngo-stack/stack  MIT License  https://github.com/go-stack/stack/blob/master/LICENSE.md\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Chris Hines\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\ngodbus/dbus  BSD 2-Clause \"Simplified\" License  https://github.com/godbus/dbus/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright notice,\nthis list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngogo/protobuf  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/gogo/protobuf/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013, The GoGo Authors. All rights reserved.\n\nProtocol Buffers for Go with Gadgets\n\nGo support for Protocol Buffers - Google's data interchange format\n\nCopyright 2010 The Go Authors.  All rights reserved.\nhttps://github.com/golang/protobuf\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n--------------------------------------------------------------------------------\ngolang/glog  Apache License 2.0  https://github.com/golang/glog/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-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\n--------------------------------------------------------------------------------\ngolang/groupcache  Apache License 2.0  https://github.com/golang/groupcache/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-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\n--------------------------------------------------------------------------------\ngolang/mock  Apache License 2.0  https://github.com/golang/mock/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngolang/protobuf  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/protobuf/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2010 The Go Authors.  All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n--------------------------------------------------------------------------------\ngolangplus/bytes  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golangplus/bytes/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2015, Golang Plus\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of bytes nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n--------------------------------------------------------------------------------\ngolangplus/fmt  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golangplus/fmt/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2015, Golang Plus\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of fmt nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n--------------------------------------------------------------------------------\ngolangplus/testing  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golangplus/testing/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2015, Golang Plus\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of testing nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n--------------------------------------------------------------------------------\ngoogle/btree  Apache License 2.0  https://github.com/google/btree/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngoogle/cadvisor  Apache License 2.0  https://github.com/google/cadvisor/blob/master/LICENSE\n--------------------------------------------------------------------------------\n   Copyright 2014 The cAdvisor Authors\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                                 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--------------------------------------------------------------------------------\ngoogle/certificate-transparency-go  Apache License 2.0  https://github.com/google/certificate-transparency-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngoogle/go-cmp  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/google/go-cmp/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2017 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngoogle/gofuzz  Apache License 2.0  https://github.com/google/gofuzz/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngoogle/martian  Apache License 2.0  https://github.com/google/martian/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngoogle/pprof  Apache License 2.0  https://github.com/google/pprof/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngoogle/renameio  Apache License 2.0  https://github.com/google/renameio/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngoogle/uuid  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/google/uuid/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009,2014 Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngoogleapis/gnostic  Apache License 2.0  https://github.com/googleapis/gnostic/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n\n--------------------------------------------------------------------------------\ngophercloud/gophercloud  Apache License 2.0  https://github.com/gophercloud/gophercloud/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2012-2013 Rackspace, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License.  You may obtain a copy of the\nLicense at\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied.  See the License for the\nspecific language governing permissions and limitations under the License.                                \n\n------\n \n\t\t\t\tApache 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--------------------------------------------------------------------------------\ngopherjs/gopherjs  BSD 2-Clause \"Simplified\" License  https://github.com/gopherjs/gopherjs/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013 Richard Musiol. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngorilla/context  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/gorilla/context/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 Rodrigo Moraes. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n\t * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\t * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\t * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngorilla/mux  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/gorilla/mux/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012-2018 The Gorilla Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n\t * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\t * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\t * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngorilla/websocket  BSD 2-Clause \"Simplified\" License  https://github.com/gorilla/websocket/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n  Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngregjones/httpcache  MIT License  https://github.com/gregjones/httpcache/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nCopyright © 2012 Greg Jones (greg.jones@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n--------------------------------------------------------------------------------\ngrpc-ecosystem/go-grpc-middleware  Apache License 2.0  https://github.com/grpc-ecosystem/go-grpc-middleware/blob/master/LICENSE\n--------------------------------------------------------------------------------\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--------------------------------------------------------------------------------\ngrpc-ecosystem/go-grpc-prometheus  Apache License 2.0  https://github.com/grpc-ecosystem/go-grpc-prometheus/blob/master/LICENSE\n--------------------------------------------------------------------------------\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--------------------------------------------------------------------------------\ngrpc-ecosystem/grpc-gateway  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nCopyright (c) 2015, Gengo, Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimer in the documentation\n      and/or other materials provided with the distribution.\n\n    * Neither the name of Gengo, Inc. nor the names of its\n      contributors may be used to endorse or promote products derived from this\n      software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nhashicorp/go-cleanhttp  Mozilla Public License 2.0  https://github.com/hashicorp/go-cleanhttp/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. \"Contributor\"\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n\n     means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the terms of\n        a Secondary License.\n\n1.6. \"Executable Form\"\n\n     means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n\n     means a work that combines Covered Software with other material, in a\n     separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n\n     means this document.\n\n1.9. \"Licensable\"\n\n     means having the right to grant, to the maximum extent possible, whether\n     at the time of the initial grant or subsequently, any and all of the\n     rights conveyed by this License.\n\n1.10. \"Modifications\"\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. \"Patent Claims\" of a Contributor\n\n      means any patent claim(s), including without limitation, method,\n      process, and apparatus claims, in any patent Licensable by such\n      Contributor that would be infringed, but for the grant of the License,\n      by the making, using, selling, offering for sale, having made, import,\n      or transfer of either its Contributions or its Contributor Version.\n\n1.12. \"Secondary License\"\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. \"Source Code Form\"\n\n      means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, \"You\" includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, \"control\" means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or\n        as part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its\n        Contributions or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution\n     become effective for each Contribution on the date the Contributor first\n     distributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under\n     this License. No additional rights or licenses will be implied from the\n     distribution or licensing of Covered Software under this License.\n     Notwithstanding Section 2.1(b) above, no patent license is granted by a\n     Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party's\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of\n        its Contributions.\n\n     This License does not grant any rights in the trademarks, service marks,\n     or logos of any Contributor (except as may be necessary to comply with\n     the notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this\n     License (see Section 10.2) or under the terms of a Secondary License (if\n     permitted under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its\n     Contributions are its original creation(s) or it has sufficient rights to\n     grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under\n     applicable copyright doctrines of fair use, fair dealing, or other\n     equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under\n     the terms of this License. You must inform recipients that the Source\n     Code Form of the Covered Software is governed by the terms of this\n     License, and how they can obtain a copy of this License. You may not\n     attempt to alter or restrict the recipients' rights in the Source Code\n     Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this\n        License, or sublicense it under different terms, provided that the\n        license for the Executable Form does not attempt to limit or alter the\n        recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for\n     the Covered Software. If the Larger Work is a combination of Covered\n     Software with a work governed by one or more Secondary Licenses, and the\n     Covered Software is not Incompatible With Secondary Licenses, this\n     License permits You to additionally distribute such Covered Software\n     under the terms of such Secondary License(s), so that the recipient of\n     the Larger Work may, at their option, further distribute the Covered\n     Software under the terms of either this License or such Secondary\n     License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices\n     (including copyright notices, patent notices, disclaimers of warranty, or\n     limitations of liability) contained within the Source Code Form of the\n     Covered Software, except that You may alter any license notices to the\n     extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on\n     behalf of any Contributor. You must make it absolutely clear that any\n     such warranty, support, indemnity, or liability obligation is offered by\n     You alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute,\n   judicial order, or regulation then You must: (a) comply with the terms of\n   this License to the maximum extent possible; and (b) describe the\n   limitations and the code they affect. Such description must be placed in a\n   text file included with all distributions of the Covered Software under\n   this License. Except to the extent prohibited by statute or regulation,\n   such description must be sufficiently detailed for a recipient of ordinary\n   skill to be able to understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing\n     basis, if such Contributor fails to notify You of the non-compliance by\n     some reasonable means prior to 60 days after You have come back into\n     compliance. Moreover, Your grants from a particular Contributor are\n     reinstated on an ongoing basis if such Contributor notifies You of the\n     non-compliance by some reasonable means, this is the first time You have\n     received notice of non-compliance with this License from such\n     Contributor, and You become compliant prior to 30 days after Your receipt\n     of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions,\n     counter-claims, and cross-claims) alleging that a Contributor Version\n     directly or indirectly infringes any patent, then the rights granted to\n     You by any and all Contributors for the Covered Software under Section\n     2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an \"as is\" basis,\n   without warranty of any kind, either expressed, implied, or statutory,\n   including, without limitation, warranties that the Covered Software is free\n   of defects, merchantable, fit for a particular purpose or non-infringing.\n   The entire risk as to the quality and performance of the Covered Software\n   is with You. Should any Covered Software prove defective in any respect,\n   You (not any Contributor) assume the cost of any necessary servicing,\n   repair, or correction. This disclaimer of warranty constitutes an essential\n   part of this License. No use of  any Covered Software is authorized under\n   this License except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from\n   such party's negligence to the extent applicable law prohibits such\n   limitation. Some jurisdictions do not allow the exclusion or limitation of\n   incidental or consequential damages, so this exclusion and limitation may\n   not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts\n   of a jurisdiction where the defendant maintains its principal place of\n   business and such litigation shall be governed by laws of that\n   jurisdiction, without reference to its conflict-of-law provisions. Nothing\n   in this Section shall prevent a party's ability to bring cross-claims or\n   counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject\n   matter hereof. If any provision of this License is held to be\n   unenforceable, such provision shall be reformed only to the extent\n   necessary to make it enforceable. Any law or regulation which provides that\n   the language of a contract shall be construed against the drafter shall not\n   be used to construe this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version\n      of the License under which You originally received the Covered Software,\n      or under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a\n      modified version of this License if you rename the license and remove\n      any references to the name of the license steward (except to note that\n      such modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\n      Licenses If You choose to distribute Source Code Form that is\n      Incompatible With Secondary Licenses under the terms of this version of\n      the License, the notice described in Exhibit B of this License must be\n      attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file,\nthen You may include the notice in a location (such as a LICENSE file in a\nrelevant directory) where a recipient would be likely to look for such a\nnotice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n\n      This Source Code Form is \"Incompatible\n      With Secondary Licenses\", as defined by\n      the Mozilla Public License, v. 2.0.\n\n\n--------------------------------------------------------------------------------\nhashicorp/go-getter  Mozilla Public License 2.0  https://github.com/hashicorp/go-getter/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. “Contributor”\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. “Contributor Version”\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor’s Contribution.\n\n1.3. “Contribution”\n\n     means Covered Software of a particular Contributor.\n\n1.4. “Covered Software”\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. “Incompatible With Secondary Licenses”\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of version\n        1.1 or earlier of the License, but not also under the terms of a\n        Secondary License.\n\n1.6. “Executable Form”\n\n     means any form of the work other than Source Code Form.\n\n1.7. “Larger Work”\n\n     means a work that combines Covered Software with other material, in a separate\n     file or files, that is not Covered Software.\n\n1.8. “License”\n\n     means this document.\n\n1.9. “Licensable”\n\n     means having the right to grant, to the maximum extent possible, whether at the\n     time of the initial grant or subsequently, any and all of the rights conveyed by\n     this License.\n\n1.10. “Modifications”\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to, deletion\n        from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. “Patent Claims” of a Contributor\n\n      means any patent claim(s), including without limitation, method, process,\n      and apparatus claims, in any patent Licensable by such Contributor that\n      would be infringed, but for the grant of the License, by the making,\n      using, selling, offering for sale, having made, import, or transfer of\n      either its Contributions or its Contributor Version.\n\n1.12. “Secondary License”\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. “Source Code Form”\n\n      means the form of the work preferred for making modifications.\n\n1.14. “You” (or “Your”)\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, “You” includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, “control” means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or as\n        part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its Contributions\n        or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution become\n     effective for each Contribution on the date the Contributor first distributes\n     such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under this\n     License. No additional rights or licenses will be implied from the distribution\n     or licensing of Covered Software under this License. Notwithstanding Section\n     2.1(b) above, no patent license is granted by a Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party’s\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of its\n        Contributions.\n\n     This License does not grant any rights in the trademarks, service marks, or\n     logos of any Contributor (except as may be necessary to comply with the\n     notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this License\n     (see Section 10.2) or under the terms of a Secondary License (if permitted\n     under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its Contributions\n     are its original creation(s) or it has sufficient rights to grant the\n     rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under applicable\n     copyright doctrines of fair use, fair dealing, or other equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under the\n     terms of this License. You must inform recipients that the Source Code Form\n     of the Covered Software is governed by the terms of this License, and how\n     they can obtain a copy of this License. You may not attempt to alter or\n     restrict the recipients’ rights in the Source Code Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this License,\n        or sublicense it under different terms, provided that the license for\n        the Executable Form does not attempt to limit or alter the recipients’\n        rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for the\n     Covered Software. If the Larger Work is a combination of Covered Software\n     with a work governed by one or more Secondary Licenses, and the Covered\n     Software is not Incompatible With Secondary Licenses, this License permits\n     You to additionally distribute such Covered Software under the terms of\n     such Secondary License(s), so that the recipient of the Larger Work may, at\n     their option, further distribute the Covered Software under the terms of\n     either this License or such Secondary License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices (including\n     copyright notices, patent notices, disclaimers of warranty, or limitations\n     of liability) contained within the Source Code Form of the Covered\n     Software, except that You may alter any license notices to the extent\n     required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on behalf\n     of any Contributor. You must make it absolutely clear that any such\n     warranty, support, indemnity, or liability obligation is offered by You\n     alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute, judicial\n   order, or regulation then You must: (a) comply with the terms of this License\n   to the maximum extent possible; and (b) describe the limitations and the code\n   they affect. Such description must be placed in a text file included with all\n   distributions of the Covered Software under this License. Except to the\n   extent prohibited by statute or regulation, such description must be\n   sufficiently detailed for a recipient of ordinary skill to be able to\n   understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing basis,\n     if such Contributor fails to notify You of the non-compliance by some\n     reasonable means prior to 60 days after You have come back into compliance.\n     Moreover, Your grants from a particular Contributor are reinstated on an\n     ongoing basis if such Contributor notifies You of the non-compliance by\n     some reasonable means, this is the first time You have received notice of\n     non-compliance with this License from such Contributor, and You become\n     compliant prior to 30 days after Your receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions, counter-claims,\n     and cross-claims) alleging that a Contributor Version directly or\n     indirectly infringes any patent, then the rights granted to You by any and\n     all Contributors for the Covered Software under Section 2.1 of this License\n     shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an “as is” basis, without\n   warranty of any kind, either expressed, implied, or statutory, including,\n   without limitation, warranties that the Covered Software is free of defects,\n   merchantable, fit for a particular purpose or non-infringing. The entire\n   risk as to the quality and performance of the Covered Software is with You.\n   Should any Covered Software prove defective in any respect, You (not any\n   Contributor) assume the cost of any necessary servicing, repair, or\n   correction. This disclaimer of warranty constitutes an essential part of this\n   License. No use of  any Covered Software is authorized under this License\n   except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from such\n   party’s negligence to the extent applicable law prohibits such limitation.\n   Some jurisdictions do not allow the exclusion or limitation of incidental or\n   consequential damages, so this exclusion and limitation may not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts of\n   a jurisdiction where the defendant maintains its principal place of business\n   and such litigation shall be governed by laws of that jurisdiction, without\n   reference to its conflict-of-law provisions. Nothing in this Section shall\n   prevent a party’s ability to bring cross-claims or counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject matter\n   hereof. If any provision of this License is held to be unenforceable, such\n   provision shall be reformed only to the extent necessary to make it\n   enforceable. Any law or regulation which provides that the language of a\n   contract shall be construed against the drafter shall not be used to construe\n   this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version of\n      the License under which You originally received the Covered Software, or\n      under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a modified\n      version of this License if you rename the license and remove any\n      references to the name of the license steward (except to note that such\n      modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses\n      If You choose to distribute Source Code Form that is Incompatible With\n      Secondary Licenses under the terms of this version of the License, the\n      notice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file, then\nYou may include the notice in a location (such as a LICENSE file in a relevant\ndirectory) where a recipient would be likely to look for such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - “Incompatible With Secondary Licenses” Notice\n\n      This Source Code Form is “Incompatible\n      With Secondary Licenses”, as defined by\n      the Mozilla Public License, v. 2.0.\n\n\n--------------------------------------------------------------------------------\nhashicorp/go-safetemp  Mozilla Public License 2.0  https://github.com/hashicorp/go-safetemp/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. \"Contributor\"\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n\n     means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the terms of\n        a Secondary License.\n\n1.6. \"Executable Form\"\n\n     means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n\n     means a work that combines Covered Software with other material, in a\n     separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n\n     means this document.\n\n1.9. \"Licensable\"\n\n     means having the right to grant, to the maximum extent possible, whether\n     at the time of the initial grant or subsequently, any and all of the\n     rights conveyed by this License.\n\n1.10. \"Modifications\"\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. \"Patent Claims\" of a Contributor\n\n      means any patent claim(s), including without limitation, method,\n      process, and apparatus claims, in any patent Licensable by such\n      Contributor that would be infringed, but for the grant of the License,\n      by the making, using, selling, offering for sale, having made, import,\n      or transfer of either its Contributions or its Contributor Version.\n\n1.12. \"Secondary License\"\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. \"Source Code Form\"\n\n      means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, \"You\" includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, \"control\" means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or\n        as part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its\n        Contributions or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution\n     become effective for each Contribution on the date the Contributor first\n     distributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under\n     this License. No additional rights or licenses will be implied from the\n     distribution or licensing of Covered Software under this License.\n     Notwithstanding Section 2.1(b) above, no patent license is granted by a\n     Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party's\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of\n        its Contributions.\n\n     This License does not grant any rights in the trademarks, service marks,\n     or logos of any Contributor (except as may be necessary to comply with\n     the notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this\n     License (see Section 10.2) or under the terms of a Secondary License (if\n     permitted under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its\n     Contributions are its original creation(s) or it has sufficient rights to\n     grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under\n     applicable copyright doctrines of fair use, fair dealing, or other\n     equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under\n     the terms of this License. You must inform recipients that the Source\n     Code Form of the Covered Software is governed by the terms of this\n     License, and how they can obtain a copy of this License. You may not\n     attempt to alter or restrict the recipients' rights in the Source Code\n     Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this\n        License, or sublicense it under different terms, provided that the\n        license for the Executable Form does not attempt to limit or alter the\n        recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for\n     the Covered Software. If the Larger Work is a combination of Covered\n     Software with a work governed by one or more Secondary Licenses, and the\n     Covered Software is not Incompatible With Secondary Licenses, this\n     License permits You to additionally distribute such Covered Software\n     under the terms of such Secondary License(s), so that the recipient of\n     the Larger Work may, at their option, further distribute the Covered\n     Software under the terms of either this License or such Secondary\n     License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices\n     (including copyright notices, patent notices, disclaimers of warranty, or\n     limitations of liability) contained within the Source Code Form of the\n     Covered Software, except that You may alter any license notices to the\n     extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on\n     behalf of any Contributor. You must make it absolutely clear that any\n     such warranty, support, indemnity, or liability obligation is offered by\n     You alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute,\n   judicial order, or regulation then You must: (a) comply with the terms of\n   this License to the maximum extent possible; and (b) describe the\n   limitations and the code they affect. Such description must be placed in a\n   text file included with all distributions of the Covered Software under\n   this License. Except to the extent prohibited by statute or regulation,\n   such description must be sufficiently detailed for a recipient of ordinary\n   skill to be able to understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing\n     basis, if such Contributor fails to notify You of the non-compliance by\n     some reasonable means prior to 60 days after You have come back into\n     compliance. Moreover, Your grants from a particular Contributor are\n     reinstated on an ongoing basis if such Contributor notifies You of the\n     non-compliance by some reasonable means, this is the first time You have\n     received notice of non-compliance with this License from such\n     Contributor, and You become compliant prior to 30 days after Your receipt\n     of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions,\n     counter-claims, and cross-claims) alleging that a Contributor Version\n     directly or indirectly infringes any patent, then the rights granted to\n     You by any and all Contributors for the Covered Software under Section\n     2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an \"as is\" basis,\n   without warranty of any kind, either expressed, implied, or statutory,\n   including, without limitation, warranties that the Covered Software is free\n   of defects, merchantable, fit for a particular purpose or non-infringing.\n   The entire risk as to the quality and performance of the Covered Software\n   is with You. Should any Covered Software prove defective in any respect,\n   You (not any Contributor) assume the cost of any necessary servicing,\n   repair, or correction. This disclaimer of warranty constitutes an essential\n   part of this License. No use of  any Covered Software is authorized under\n   this License except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from\n   such party's negligence to the extent applicable law prohibits such\n   limitation. Some jurisdictions do not allow the exclusion or limitation of\n   incidental or consequential damages, so this exclusion and limitation may\n   not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts\n   of a jurisdiction where the defendant maintains its principal place of\n   business and such litigation shall be governed by laws of that\n   jurisdiction, without reference to its conflict-of-law provisions. Nothing\n   in this Section shall prevent a party's ability to bring cross-claims or\n   counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject\n   matter hereof. If any provision of this License is held to be\n   unenforceable, such provision shall be reformed only to the extent\n   necessary to make it enforceable. Any law or regulation which provides that\n   the language of a contract shall be construed against the drafter shall not\n   be used to construe this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version\n      of the License under which You originally received the Covered Software,\n      or under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a\n      modified version of this License if you rename the license and remove\n      any references to the name of the license steward (except to note that\n      such modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\n      Licenses If You choose to distribute Source Code Form that is\n      Incompatible With Secondary Licenses under the terms of this version of\n      the License, the notice described in Exhibit B of this License must be\n      attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file,\nthen You may include the notice in a location (such as a LICENSE file in a\nrelevant directory) where a recipient would be likely to look for such a\nnotice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n\n      This Source Code Form is \"Incompatible\n      With Secondary Licenses\", as defined by\n      the Mozilla Public License, v. 2.0.\n\n--------------------------------------------------------------------------------\nhashicorp/go-version  Mozilla Public License 2.0  https://github.com/hashicorp/go-version/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. “Contributor”\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. “Contributor Version”\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor’s Contribution.\n\n1.3. “Contribution”\n\n     means Covered Software of a particular Contributor.\n\n1.4. “Covered Software”\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. “Incompatible With Secondary Licenses”\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of version\n        1.1 or earlier of the License, but not also under the terms of a\n        Secondary License.\n\n1.6. “Executable Form”\n\n     means any form of the work other than Source Code Form.\n\n1.7. “Larger Work”\n\n     means a work that combines Covered Software with other material, in a separate\n     file or files, that is not Covered Software.\n\n1.8. “License”\n\n     means this document.\n\n1.9. “Licensable”\n\n     means having the right to grant, to the maximum extent possible, whether at the\n     time of the initial grant or subsequently, any and all of the rights conveyed by\n     this License.\n\n1.10. “Modifications”\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to, deletion\n        from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. “Patent Claims” of a Contributor\n\n      means any patent claim(s), including without limitation, method, process,\n      and apparatus claims, in any patent Licensable by such Contributor that\n      would be infringed, but for the grant of the License, by the making,\n      using, selling, offering for sale, having made, import, or transfer of\n      either its Contributions or its Contributor Version.\n\n1.12. “Secondary License”\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. “Source Code Form”\n\n      means the form of the work preferred for making modifications.\n\n1.14. “You” (or “Your”)\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, “You” includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, “control” means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or as\n        part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its Contributions\n        or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution become\n     effective for each Contribution on the date the Contributor first distributes\n     such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under this\n     License. No additional rights or licenses will be implied from the distribution\n     or licensing of Covered Software under this License. Notwithstanding Section\n     2.1(b) above, no patent license is granted by a Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party’s\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of its\n        Contributions.\n\n     This License does not grant any rights in the trademarks, service marks, or\n     logos of any Contributor (except as may be necessary to comply with the\n     notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this License\n     (see Section 10.2) or under the terms of a Secondary License (if permitted\n     under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its Contributions\n     are its original creation(s) or it has sufficient rights to grant the\n     rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under applicable\n     copyright doctrines of fair use, fair dealing, or other equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under the\n     terms of this License. You must inform recipients that the Source Code Form\n     of the Covered Software is governed by the terms of this License, and how\n     they can obtain a copy of this License. You may not attempt to alter or\n     restrict the recipients’ rights in the Source Code Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this License,\n        or sublicense it under different terms, provided that the license for\n        the Executable Form does not attempt to limit or alter the recipients’\n        rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for the\n     Covered Software. If the Larger Work is a combination of Covered Software\n     with a work governed by one or more Secondary Licenses, and the Covered\n     Software is not Incompatible With Secondary Licenses, this License permits\n     You to additionally distribute such Covered Software under the terms of\n     such Secondary License(s), so that the recipient of the Larger Work may, at\n     their option, further distribute the Covered Software under the terms of\n     either this License or such Secondary License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices (including\n     copyright notices, patent notices, disclaimers of warranty, or limitations\n     of liability) contained within the Source Code Form of the Covered\n     Software, except that You may alter any license notices to the extent\n     required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on behalf\n     of any Contributor. You must make it absolutely clear that any such\n     warranty, support, indemnity, or liability obligation is offered by You\n     alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute, judicial\n   order, or regulation then You must: (a) comply with the terms of this License\n   to the maximum extent possible; and (b) describe the limitations and the code\n   they affect. Such description must be placed in a text file included with all\n   distributions of the Covered Software under this License. Except to the\n   extent prohibited by statute or regulation, such description must be\n   sufficiently detailed for a recipient of ordinary skill to be able to\n   understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing basis,\n     if such Contributor fails to notify You of the non-compliance by some\n     reasonable means prior to 60 days after You have come back into compliance.\n     Moreover, Your grants from a particular Contributor are reinstated on an\n     ongoing basis if such Contributor notifies You of the non-compliance by\n     some reasonable means, this is the first time You have received notice of\n     non-compliance with this License from such Contributor, and You become\n     compliant prior to 30 days after Your receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions, counter-claims,\n     and cross-claims) alleging that a Contributor Version directly or\n     indirectly infringes any patent, then the rights granted to You by any and\n     all Contributors for the Covered Software under Section 2.1 of this License\n     shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an “as is” basis, without\n   warranty of any kind, either expressed, implied, or statutory, including,\n   without limitation, warranties that the Covered Software is free of defects,\n   merchantable, fit for a particular purpose or non-infringing. The entire\n   risk as to the quality and performance of the Covered Software is with You.\n   Should any Covered Software prove defective in any respect, You (not any\n   Contributor) assume the cost of any necessary servicing, repair, or\n   correction. This disclaimer of warranty constitutes an essential part of this\n   License. No use of  any Covered Software is authorized under this License\n   except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from such\n   party’s negligence to the extent applicable law prohibits such limitation.\n   Some jurisdictions do not allow the exclusion or limitation of incidental or\n   consequential damages, so this exclusion and limitation may not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts of\n   a jurisdiction where the defendant maintains its principal place of business\n   and such litigation shall be governed by laws of that jurisdiction, without\n   reference to its conflict-of-law provisions. Nothing in this Section shall\n   prevent a party’s ability to bring cross-claims or counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject matter\n   hereof. If any provision of this License is held to be unenforceable, such\n   provision shall be reformed only to the extent necessary to make it\n   enforceable. Any law or regulation which provides that the language of a\n   contract shall be construed against the drafter shall not be used to construe\n   this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version of\n      the License under which You originally received the Covered Software, or\n      under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a modified\n      version of this License if you rename the license and remove any\n      references to the name of the license steward (except to note that such\n      modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses\n      If You choose to distribute Source Code Form that is Incompatible With\n      Secondary Licenses under the terms of this version of the License, the\n      notice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file, then\nYou may include the notice in a location (such as a LICENSE file in a relevant\ndirectory) where a recipient would be likely to look for such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - “Incompatible With Secondary Licenses” Notice\n\n      This Source Code Form is “Incompatible\n      With Secondary Licenses”, as defined by\n      the Mozilla Public License, v. 2.0.\n\n\n--------------------------------------------------------------------------------\nhashicorp/golang-lru  Mozilla Public License 2.0  https://github.com/hashicorp/golang-lru/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. \"Contributor\"\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n\n     means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the terms of\n        a Secondary License.\n\n1.6. \"Executable Form\"\n\n     means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n\n     means a work that combines Covered Software with other material, in a\n     separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n\n     means this document.\n\n1.9. \"Licensable\"\n\n     means having the right to grant, to the maximum extent possible, whether\n     at the time of the initial grant or subsequently, any and all of the\n     rights conveyed by this License.\n\n1.10. \"Modifications\"\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. \"Patent Claims\" of a Contributor\n\n      means any patent claim(s), including without limitation, method,\n      process, and apparatus claims, in any patent Licensable by such\n      Contributor that would be infringed, but for the grant of the License,\n      by the making, using, selling, offering for sale, having made, import,\n      or transfer of either its Contributions or its Contributor Version.\n\n1.12. \"Secondary License\"\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. \"Source Code Form\"\n\n      means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, \"You\" includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, \"control\" means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or\n        as part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its\n        Contributions or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution\n     become effective for each Contribution on the date the Contributor first\n     distributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under\n     this License. No additional rights or licenses will be implied from the\n     distribution or licensing of Covered Software under this License.\n     Notwithstanding Section 2.1(b) above, no patent license is granted by a\n     Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party's\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of\n        its Contributions.\n\n     This License does not grant any rights in the trademarks, service marks,\n     or logos of any Contributor (except as may be necessary to comply with\n     the notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this\n     License (see Section 10.2) or under the terms of a Secondary License (if\n     permitted under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its\n     Contributions are its original creation(s) or it has sufficient rights to\n     grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under\n     applicable copyright doctrines of fair use, fair dealing, or other\n     equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under\n     the terms of this License. You must inform recipients that the Source\n     Code Form of the Covered Software is governed by the terms of this\n     License, and how they can obtain a copy of this License. You may not\n     attempt to alter or restrict the recipients' rights in the Source Code\n     Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this\n        License, or sublicense it under different terms, provided that the\n        license for the Executable Form does not attempt to limit or alter the\n        recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for\n     the Covered Software. If the Larger Work is a combination of Covered\n     Software with a work governed by one or more Secondary Licenses, and the\n     Covered Software is not Incompatible With Secondary Licenses, this\n     License permits You to additionally distribute such Covered Software\n     under the terms of such Secondary License(s), so that the recipient of\n     the Larger Work may, at their option, further distribute the Covered\n     Software under the terms of either this License or such Secondary\n     License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices\n     (including copyright notices, patent notices, disclaimers of warranty, or\n     limitations of liability) contained within the Source Code Form of the\n     Covered Software, except that You may alter any license notices to the\n     extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on\n     behalf of any Contributor. You must make it absolutely clear that any\n     such warranty, support, indemnity, or liability obligation is offered by\n     You alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute,\n   judicial order, or regulation then You must: (a) comply with the terms of\n   this License to the maximum extent possible; and (b) describe the\n   limitations and the code they affect. Such description must be placed in a\n   text file included with all distributions of the Covered Software under\n   this License. Except to the extent prohibited by statute or regulation,\n   such description must be sufficiently detailed for a recipient of ordinary\n   skill to be able to understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing\n     basis, if such Contributor fails to notify You of the non-compliance by\n     some reasonable means prior to 60 days after You have come back into\n     compliance. Moreover, Your grants from a particular Contributor are\n     reinstated on an ongoing basis if such Contributor notifies You of the\n     non-compliance by some reasonable means, this is the first time You have\n     received notice of non-compliance with this License from such\n     Contributor, and You become compliant prior to 30 days after Your receipt\n     of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions,\n     counter-claims, and cross-claims) alleging that a Contributor Version\n     directly or indirectly infringes any patent, then the rights granted to\n     You by any and all Contributors for the Covered Software under Section\n     2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an \"as is\" basis,\n   without warranty of any kind, either expressed, implied, or statutory,\n   including, without limitation, warranties that the Covered Software is free\n   of defects, merchantable, fit for a particular purpose or non-infringing.\n   The entire risk as to the quality and performance of the Covered Software\n   is with You. Should any Covered Software prove defective in any respect,\n   You (not any Contributor) assume the cost of any necessary servicing,\n   repair, or correction. This disclaimer of warranty constitutes an essential\n   part of this License. No use of  any Covered Software is authorized under\n   this License except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from\n   such party's negligence to the extent applicable law prohibits such\n   limitation. Some jurisdictions do not allow the exclusion or limitation of\n   incidental or consequential damages, so this exclusion and limitation may\n   not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts\n   of a jurisdiction where the defendant maintains its principal place of\n   business and such litigation shall be governed by laws of that\n   jurisdiction, without reference to its conflict-of-law provisions. Nothing\n   in this Section shall prevent a party's ability to bring cross-claims or\n   counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject\n   matter hereof. If any provision of this License is held to be\n   unenforceable, such provision shall be reformed only to the extent\n   necessary to make it enforceable. Any law or regulation which provides that\n   the language of a contract shall be construed against the drafter shall not\n   be used to construe this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version\n      of the License under which You originally received the Covered Software,\n      or under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a\n      modified version of this License if you rename the license and remove\n      any references to the name of the license steward (except to note that\n      such modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\n      Licenses If You choose to distribute Source Code Form that is\n      Incompatible With Secondary Licenses under the terms of this version of\n      the License, the notice described in Exhibit B of this License must be\n      attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file,\nthen You may include the notice in a location (such as a LICENSE file in a\nrelevant directory) where a recipient would be likely to look for such a\nnotice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n\n      This Source Code Form is \"Incompatible\n      With Secondary Licenses\", as defined by\n      the Mozilla Public License, v. 2.0.\n\n--------------------------------------------------------------------------------\nhashicorp/hcl  Mozilla Public License 2.0  https://github.com/hashicorp/hcl/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. “Contributor”\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. “Contributor Version”\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor’s Contribution.\n\n1.3. “Contribution”\n\n     means Covered Software of a particular Contributor.\n\n1.4. “Covered Software”\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. “Incompatible With Secondary Licenses”\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of version\n        1.1 or earlier of the License, but not also under the terms of a\n        Secondary License.\n\n1.6. “Executable Form”\n\n     means any form of the work other than Source Code Form.\n\n1.7. “Larger Work”\n\n     means a work that combines Covered Software with other material, in a separate\n     file or files, that is not Covered Software.\n\n1.8. “License”\n\n     means this document.\n\n1.9. “Licensable”\n\n     means having the right to grant, to the maximum extent possible, whether at the\n     time of the initial grant or subsequently, any and all of the rights conveyed by\n     this License.\n\n1.10. “Modifications”\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to, deletion\n        from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. “Patent Claims” of a Contributor\n\n      means any patent claim(s), including without limitation, method, process,\n      and apparatus claims, in any patent Licensable by such Contributor that\n      would be infringed, but for the grant of the License, by the making,\n      using, selling, offering for sale, having made, import, or transfer of\n      either its Contributions or its Contributor Version.\n\n1.12. “Secondary License”\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. “Source Code Form”\n\n      means the form of the work preferred for making modifications.\n\n1.14. “You” (or “Your”)\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, “You” includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, “control” means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or as\n        part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its Contributions\n        or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution become\n     effective for each Contribution on the date the Contributor first distributes\n     such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under this\n     License. No additional rights or licenses will be implied from the distribution\n     or licensing of Covered Software under this License. Notwithstanding Section\n     2.1(b) above, no patent license is granted by a Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party’s\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of its\n        Contributions.\n\n     This License does not grant any rights in the trademarks, service marks, or\n     logos of any Contributor (except as may be necessary to comply with the\n     notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this License\n     (see Section 10.2) or under the terms of a Secondary License (if permitted\n     under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its Contributions\n     are its original creation(s) or it has sufficient rights to grant the\n     rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under applicable\n     copyright doctrines of fair use, fair dealing, or other equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under the\n     terms of this License. You must inform recipients that the Source Code Form\n     of the Covered Software is governed by the terms of this License, and how\n     they can obtain a copy of this License. You may not attempt to alter or\n     restrict the recipients’ rights in the Source Code Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this License,\n        or sublicense it under different terms, provided that the license for\n        the Executable Form does not attempt to limit or alter the recipients’\n        rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for the\n     Covered Software. If the Larger Work is a combination of Covered Software\n     with a work governed by one or more Secondary Licenses, and the Covered\n     Software is not Incompatible With Secondary Licenses, this License permits\n     You to additionally distribute such Covered Software under the terms of\n     such Secondary License(s), so that the recipient of the Larger Work may, at\n     their option, further distribute the Covered Software under the terms of\n     either this License or such Secondary License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices (including\n     copyright notices, patent notices, disclaimers of warranty, or limitations\n     of liability) contained within the Source Code Form of the Covered\n     Software, except that You may alter any license notices to the extent\n     required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on behalf\n     of any Contributor. You must make it absolutely clear that any such\n     warranty, support, indemnity, or liability obligation is offered by You\n     alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute, judicial\n   order, or regulation then You must: (a) comply with the terms of this License\n   to the maximum extent possible; and (b) describe the limitations and the code\n   they affect. Such description must be placed in a text file included with all\n   distributions of the Covered Software under this License. Except to the\n   extent prohibited by statute or regulation, such description must be\n   sufficiently detailed for a recipient of ordinary skill to be able to\n   understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing basis,\n     if such Contributor fails to notify You of the non-compliance by some\n     reasonable means prior to 60 days after You have come back into compliance.\n     Moreover, Your grants from a particular Contributor are reinstated on an\n     ongoing basis if such Contributor notifies You of the non-compliance by\n     some reasonable means, this is the first time You have received notice of\n     non-compliance with this License from such Contributor, and You become\n     compliant prior to 30 days after Your receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions, counter-claims,\n     and cross-claims) alleging that a Contributor Version directly or\n     indirectly infringes any patent, then the rights granted to You by any and\n     all Contributors for the Covered Software under Section 2.1 of this License\n     shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an “as is” basis, without\n   warranty of any kind, either expressed, implied, or statutory, including,\n   without limitation, warranties that the Covered Software is free of defects,\n   merchantable, fit for a particular purpose or non-infringing. The entire\n   risk as to the quality and performance of the Covered Software is with You.\n   Should any Covered Software prove defective in any respect, You (not any\n   Contributor) assume the cost of any necessary servicing, repair, or\n   correction. This disclaimer of warranty constitutes an essential part of this\n   License. No use of  any Covered Software is authorized under this License\n   except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from such\n   party’s negligence to the extent applicable law prohibits such limitation.\n   Some jurisdictions do not allow the exclusion or limitation of incidental or\n   consequential damages, so this exclusion and limitation may not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts of\n   a jurisdiction where the defendant maintains its principal place of business\n   and such litigation shall be governed by laws of that jurisdiction, without\n   reference to its conflict-of-law provisions. Nothing in this Section shall\n   prevent a party’s ability to bring cross-claims or counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject matter\n   hereof. If any provision of this License is held to be unenforceable, such\n   provision shall be reformed only to the extent necessary to make it\n   enforceable. Any law or regulation which provides that the language of a\n   contract shall be construed against the drafter shall not be used to construe\n   this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version of\n      the License under which You originally received the Covered Software, or\n      under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a modified\n      version of this License if you rename the license and remove any\n      references to the name of the license steward (except to note that such\n      modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses\n      If You choose to distribute Source Code Form that is Incompatible With\n      Secondary Licenses under the terms of this version of the License, the\n      notice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file, then\nYou may include the notice in a location (such as a LICENSE file in a relevant\ndirectory) where a recipient would be likely to look for such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - “Incompatible With Secondary Licenses” Notice\n\n      This Source Code Form is “Incompatible\n      With Secondary Licenses”, as defined by\n      the Mozilla Public License, v. 2.0.\n\n\n--------------------------------------------------------------------------------\nheketi/heketi  Apache License 2.0  https://github.com/heketi/heketi/blob/master/LICENSE\n--------------------------------------------------------------------------------\nHeketi code is released under various licenses:\n\nThe REST API client code (in go and python) is released\nunder a dual license of Apache 2.0 or LGPLv3+.\n\nThe other parts of heketi (server, cli, tests, ...) are released\nunder a dual license of LGPLv3+ or GPLv2.\n\n--------------------------------------------------------------------------------\nheketi/rest  Apache License 2.0  https://github.com/heketi/rest/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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--------------------------------------------------------------------------------\nheketi/tests  Apache License 2.0  https://github.com/heketi/tests/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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--------------------------------------------------------------------------------\nhpcloud/tail  MIT License  https://github.com/hpcloud/tail/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\n# The MIT License (MIT)\n\n# © Copyright 2015 Hewlett Packard Enterprise Development LP\nCopyright (c) 2014 ActiveState\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nimdario/mergo  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/imdario/mergo/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013 Dario Castañé. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ninconshreveable/mousetrap  Apache License 2.0  https://github.com/inconshreveable/mousetrap/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2014 Alan Shreve\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n--------------------------------------------------------------------------------\njmespath/go-jmespath  Apache License 2.0  https://github.com/jmespath/go-jmespath/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2015 James Saryerwinnie\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n--------------------------------------------------------------------------------\njonboulle/clockwork  Apache License 2.0  https://github.com/jonboulle/clockwork/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n--------------------------------------------------------------------------------\njson-iterator/go  MIT License  https://github.com/json-iterator/go/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMIT License\n\nCopyright (c) 2016 json-iterator\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\njstemmer/go-junit-report  MIT License  https://github.com/jstemmer/go-junit-report/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 Joel Stemmer\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\njteeuwen/go-bindata  Public Domain Dedication  https://github.com/jteeuwen/go-bindata/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThis work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication\nlicense. Its contents can be found at:\nhttp://creativecommons.org/publicdomain/zero/1.0\n\n--------------------------------------------------------------------------------\njtolds/gls  MIT License  https://github.com/jtolds/gls/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013, Space Monkey, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\njulienschmidt/httprouter  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/julienschmidt/httprouter/blob/master/LICENSE\n--------------------------------------------------------------------------------\nBSD 3-Clause License\n\nCopyright (c) 2013, Julien Schmidt\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nkardianos/osext  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/kardianos/osext/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nkarrick/godirwalk  BSD 2-Clause \"Simplified\" License  https://github.com/karrick/godirwalk/blob/master/LICENSE\n--------------------------------------------------------------------------------\nBSD 2-Clause License\n\nCopyright (c) 2017, Karrick McDermott\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nkisielk/errcheck  MIT License  https://github.com/kisielk/errcheck/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013 Kamil Kisiel\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nkisielk/gotool  MIT License  https://github.com/kisielk/gotool/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013 Kamil Kisiel <kamil@kamilkisiel.net>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nkonsorten/go-windows-terminal-sequences  MIT License  https://github.com/konsorten/go-windows-terminal-sequences/blob/master/LICENSE\n--------------------------------------------------------------------------------\n(The MIT License)\n\nCopyright (c) 2017 marvin + konsorten GmbH (open-source@konsorten.de)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nkr/fs  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/kr/fs/blob/main/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nkr/pretty  MIT License  https://github.com/kr/pretty/blob/main/License\n--------------------------------------------------------------------------------\nCopyright 2012 Keith Rarick\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nkr/pty  MIT License  https://github.com/kr/pty/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2019 Keith Rarick\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute,\nsublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall\nbe included in all copies or substantial portions of the\nSoftware.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY\nKIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nkr/text  MIT License  https://github.com/kr/text/blob/main/License\n--------------------------------------------------------------------------------\nCopyright 2012 Keith Rarick\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nkubeflow/kubeflow  Apache License 2.0  https://github.com/kubeflow/kubeflow/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes-sigs/application  Apache License 2.0  https://github.com/kubernetes-sigs/application/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nlibopenstorage/openstorage  Apache License 2.0  https://github.com/libopenstorage/openstorage/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2015 Openstorage.org.\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--------------------------------------------------------------------------------\nliggitt/tabwriter  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/liggitt/tabwriter/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nlithammer/dedent  MIT License  https://github.com/lithammer/dedent/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2018 Peter Lithammer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nlpabon/godbc  Apache License 2.0  https://github.com/lpabon/godbc/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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--------------------------------------------------------------------------------\nmagiconair/properties  BSD 2-Clause \"Simplified\" License  https://github.com/magiconair/properties/blob/master/LICENSE\n--------------------------------------------------------------------------------\ngoproperties - properties file decoder for Go\n\nCopyright (c) 2013-2018 - Frank Schroeder\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nmailru/easyjson  MIT License  https://github.com/mailru/easyjson/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2016 Mail.Ru Group\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nmarstr/guid  MIT License  https://github.com/marstr/guid/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nMIT License\n\nCopyright (c) 2016 Martin Strobel\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\nmattn/go-colorable  MIT License  https://github.com/mattn/go-colorable/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nmattn/go-isatty  MIT License  https://github.com/mattn/go-isatty/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) Yasuhiro MATSUMOTO <mattn.jp@gmail.com>\n\nMIT License (Expat)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nmattn/go-runewidth  MIT License  https://github.com/mattn/go-runewidth/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nmattn/go-shellwords  MIT License  https://github.com/mattn/go-shellwords/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2017 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nmatttproud/golang_protobuf_extensions  Apache License 2.0  https://github.com/matttproud/golang_protobuf_extensions/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nmesos/mesos-go  Apache License 2.0  https://github.com/mesos/mesos-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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--------------------------------------------------------------------------------\nmholt/caddy  Apache License 2.0  https://github.com/caddyserver/caddy/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nmiekg/dns  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/miekg/dns/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nAs this is fork of the official Go code the same license applies.\nExtensions of the original work are copyright (c) 2011 Miek Gieben\n\n--------------------------------------------------------------------------------\nmindprince/gonvml  Apache License 2.0  https://github.com/mindprince/gonvml/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nmistifyio/go-zfs  Apache License 2.0  https://github.com/mistifyio/go-zfs/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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 (c) 2014, OmniTI Computer Consulting, Inc.\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--------------------------------------------------------------------------------\nmitchellh/go-homedir  MIT License  https://github.com/mitchellh/go-homedir/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 Mitchell Hashimoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nmitchellh/go-testing-interface  MIT License  https://github.com/mitchellh/go-testing-interface/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2016 Mitchell Hashimoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nmitchellh/go-wordwrap  MIT License  https://github.com/mitchellh/go-wordwrap/blob/master/LICENSE.md\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Mitchell Hashimoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nmitchellh/mapstructure  MIT License  https://github.com/mitchellh/mapstructure/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 Mitchell Hashimoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nmodern-go/concurrent  Apache License 2.0  https://github.com/modern-go/concurrent/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nmodern-go/reflect2  Apache License 2.0  https://github.com/modern-go/reflect2/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nmohae/deepcopy  MIT License  https://github.com/mohae/deepcopy/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Joel\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nmorikuni/aec  MIT License  https://github.com/morikuni/aec/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2016 Taihei Morikuni\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nmrunalp/fileutils  Apache License 2.0  https://github.com/mrunalp/fileutils/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2014 Docker, Inc.\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--------------------------------------------------------------------------------\nmunnerz/goautoneg  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/munnerz/goautoneg/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2011, Open Knowledge Foundation Ltd.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n\n    Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in\n    the documentation and/or other materials provided with the\n    distribution.\n\n    Neither the name of the Open Knowledge Foundation Ltd. nor the\n    names of its contributors may be used to endorse or promote\n    products derived from this software without specific prior written\n    permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nmvdan/xurls  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/mvdan/xurls/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2015, Daniel Martí. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of the copyright holder nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nmwitkow/go-conntrack  Apache License 2.0  https://github.com/mwitkow/go-conntrack/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nmxk/go-flowrate  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/mxk/go-flowrate/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2014 The Go-FlowRate Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the\n   distribution.\n\n * Neither the name of the go-flowrate project nor the names of its\n   contributors may be used to endorse or promote products derived\n   from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nnatefinch/lumberjack  MIT License  https://github.com/natefinch/lumberjack/blob/v2.0/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Nate Finch \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\nonrik/logrus  MIT License  https://github.com/onrik/logrus/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMIT License\n\nCopyright (c) 2016 Andrey\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nonsi/ginkgo  MIT License  https://github.com/onsi/ginkgo/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013-2014 Onsi Fakhouri\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nonsi/gomega  MIT License  https://github.com/onsi/gomega/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013-2014 Onsi Fakhouri\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nopencontainers/go-digest  Apache License 2.0  https://github.com/opencontainers/go-digest/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://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   Copyright 2016 Docker, Inc.\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       https://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--------------------------------------------------------------------------------\nopencontainers/image-spec  Apache License 2.0  https://github.com/opencontainers/image-spec/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2016 The Linux Foundation.\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--------------------------------------------------------------------------------\nopencontainers/runc  Apache License 2.0  https://github.com/opencontainers/runc/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2014 Docker, Inc.\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--------------------------------------------------------------------------------\nopencontainers/runtime-spec  Apache License 2.0  https://github.com/opencontainers/runtime-spec/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2015 The Linux Foundation.\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--------------------------------------------------------------------------------\nopencontainers/selinux  Apache License 2.0  https://github.com/opencontainers/selinux/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\notiai10/copy  MIT License  https://github.com/otiai10/copy/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2018 otiai10\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\notiai10/curr  Do What The Fuck You Want To Public License Version 2  https://github.com/otiai10/curr/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright © 2015 Hiromu OCHIAI <otiai10@gmail.com>\n\nThis work is free. You can redistribute it and/or modify it under the\nterms of the Do What The Fuck You Want To Public License, Version 2,\nas published by Sam Hocevar. See http://www.wtfpl.net/ for more details.\n\n--------------------------------------------------------------------------------\notiai10/mint  MIT License  https://github.com/otiai10/mint/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2017 otiai10 (Hiromu OCHIAI)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\npborman/uuid  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/pborman/uuid/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009,2014 Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\npelletier/go-toml  MIT License  https://github.com/pelletier/go-toml/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\npeterbourgon/diskv  MIT License  https://github.com/peterbourgon/diskv/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2011-2012 Peter Bourgon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\npkg/errors  BSD 2-Clause \"Simplified\" License  https://github.com/pkg/errors/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2015, Dave Cheney <dave@cheney.net>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\npkg/sftp  BSD 2-Clause \"Simplified\" License  https://github.com/pkg/sftp/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013, Dave Cheney\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\npmezard/go-difflib  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/pmezard/go-difflib/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2013, Patrick Mezard\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n    The names of its contributors may not be used to endorse or promote\nproducts derived from this software without specific prior written\npermission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\npquerna/cachecontrol  Apache License 2.0  https://github.com/pquerna/cachecontrol/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\npquerna/ffjson  Apache License 2.0  https://github.com/pquerna/ffjson/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nprometheus/client_golang  Apache License 2.0  https://github.com/prometheus/client_golang/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nprometheus/client_model  Apache License 2.0  https://github.com/prometheus/client_model/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nprometheus/common  Apache License 2.0  https://github.com/prometheus/common/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nprometheus/procfs  Apache License 2.0  https://github.com/prometheus/procfs/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nquobyte/api  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/quobyte/api/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\nCopyright (c) 2016, Quobyte Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of quobyte-automation nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nremyoudompheng/bigfft  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/remyoudompheng/bigfft/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nrobfig/cron  MIT License  https://github.com/robfig/cron/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (C) 2012 Rob Figueiredo\nAll Rights Reserved.\n\nMIT LICENSE\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nrogpeppe/go-charset  BSD 2-Clause \"Simplified\" License  https://github.com/rogpeppe/go-charset/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The go-charset Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nrogpeppe/go-internal  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/rogpeppe/go-internal/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2018 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nrubiojr/go-vhd  MIT License  https://github.com/rubiojr/go-vhd/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Sergio Rubio\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n--------------------------------------------------------------------------------\nrussross/blackfriday  BSD 2-Clause \"Simplified\" License  https://github.com/russross/blackfriday/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nBlackfriday is distributed under the Simplified BSD License:\n\n> Copyright © 2011 Russ Ross\n> All rights reserved.\n>\n> Redistribution and use in source and binary forms, with or without\n> modification, are permitted provided that the following conditions\n> are met:\n>\n> 1.  Redistributions of source code must retain the above copyright\n>     notice, this list of conditions and the following disclaimer.\n>\n> 2.  Redistributions in binary form must reproduce the above\n>     copyright notice, this list of conditions and the following\n>     disclaimer in the documentation and/or other materials provided with\n>     the distribution.\n>\n> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n> \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n> POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nsatori/go.uuid  MIT License  https://github.com/satori/go.uuid/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nseccomp/libseccomp-golang  BSD 2-Clause \"Simplified\" License  https://github.com/seccomp/libseccomp-golang/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2015 Matthew Heon <mheon@redhat.com>\nCopyright (c) 2015 Paul Moore <pmoore@redhat.com>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n- Redistributions of source code must retain the above copyright notice,\n  this list of conditions and the following disclaimer.\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nshurcooL/sanitized_anchor_name  MIT License  https://github.com/shurcooL/sanitized_anchor_name/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMIT License\n\nCopyright (c) 2015 Dmitri Shuralyov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nsigma/go-inotify  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/sigma/go-inotify/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nsirupsen/logrus  MIT License  https://github.com/sirupsen/logrus/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Simon Eskildsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nsmartystreets/assertions  MIT License  https://github.com/smartystreets/assertions/blob/master/LICENSE.md\n--------------------------------------------------------------------------------\nCopyright (c) 2016 SmartyStreets, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal \nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all \ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE \nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE \nSOFTWARE.\n\nNOTE: Various optional and subordinate components carry their own licensing\nrequirements and restrictions.  Use of those components is subject to the terms\nand conditions outlined the respective license of each component.\n\n--------------------------------------------------------------------------------\nsmartystreets/goconvey  MIT License  https://github.com/smartystreets/goconvey/blob/master/LICENSE.md\n--------------------------------------------------------------------------------\nCopyright (c) 2016 SmartyStreets, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nNOTE: Various optional and subordinate components carry their own licensing\nrequirements and restrictions.  Use of those components is subject to the terms\nand conditions outlined the respective license of each component.\n\n--------------------------------------------------------------------------------\nsoheilhy/cmux  Apache License 2.0  https://github.com/soheilhy/cmux/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nspf13/afero  Apache License 2.0  https://github.com/spf13/afero/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\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--------------------------------------------------------------------------------\nspf13/cast  MIT License  https://github.com/spf13/cast/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Steve Francia\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\nspf13/cobra  Apache License 2.0  https://github.com/spf13/cobra/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\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--------------------------------------------------------------------------------\nspf13/jwalterweatherman  MIT License  https://github.com/spf13/jwalterweatherman/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Steve Francia\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\nspf13/pflag  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/spf13/pflag/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 Alex Ogier. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nspf13/viper  MIT License  https://github.com/spf13/viper/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Steve Francia\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n--------------------------------------------------------------------------------\nstorageos/go-api  MIT License  https://github.com/storageos/go-api/blob/master/LICENCE\n--------------------------------------------------------------------------------\nMIT License\n\nCopyright (c) 2015-2018 StorageOS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nCopyright (c) 2013-2017, go-dockerclient authors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  * Redistributions of source code must retain the above copyright notice,\nthis list of conditions and the following disclaimer.\n  * Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nstretchr/objx  MIT License  https://github.com/stretchr/objx/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License\n\nCopyright (c) 2014 Stretchr, Inc.\nCopyright (c) 2017-2018 objx contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nstretchr/testify  MIT License  https://github.com/stretchr/testify/blob/master/LICENSE\n--------------------------------------------------------------------------------\nMIT License\n\nCopyright (c) 2012-2018 Mat Ryer and Tyler Bunnell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nsyndtr/gocapability  BSD 2-Clause \"Simplified\" License  https://github.com/syndtr/gocapability/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2013 Suryandaru Triandana <syndtr@gmail.com>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ntmc/grpc-websocket-proxy  MIT License  https://github.com/tmc/grpc-websocket-proxy/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (C) 2016 Travis Cline\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nugorji/go  MIT License  https://github.com/ugorji/go/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2012-2015 Ugorji Nwoke.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nulikunitz/xz  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/ulikunitz/xz/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2014-2016  Ulrich Kunitz\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* My name, Ulrich Kunitz, may not be used to endorse or promote products\n  derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nurfave/negroni  MIT License  https://github.com/urfave/negroni/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jeremy Saenz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nvishvananda/netlink  Apache License 2.0  https://github.com/vishvananda/netlink/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2014 Vishvananda Ishaya.\n   Copyright 2014 Docker, Inc.\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--------------------------------------------------------------------------------\nvishvananda/netns  Apache License 2.0  https://github.com/vishvananda/netns/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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   Copyright 2014 Vishvananda Ishaya.\n   Copyright 2014 Docker, Inc.\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--------------------------------------------------------------------------------\nvmware/govmomi  Apache License 2.0  https://github.com/vmware/govmomi/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nvmware/photon-controller-go-sdk  Apache License 2.0  https://github.com/vmware/photon-controller-go-sdk/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\t\t\t\t   Apache License\r\n                    Version 2.0, January 2004\r\n                http://www.apache.org/licenses/\r\n\r\n\t\t\r\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n1. Definitions.\r\n\r\n\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\r\n\r\n\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\r\n\r\n\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\r\n\r\n\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\r\n\r\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\r\n\r\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\r\n\r\n\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\r\n\r\n2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\r\n\r\n3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\r\n\r\n4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\r\n(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\r\n(b) You must cause any modified files to carry prominent notices stating that You changed the files; and\r\n(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\r\n(d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\r\n\r\nYou may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\r\n\r\n5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\r\n\r\n6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\r\n\r\n8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\r\n\r\n9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\r\n\r\nEND OF TERMS AND CONDITIONS\r\n\r\nAPPENDIX: How to apply the Apache License to your work.\r\n\r\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!)  The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\r\n\r\n   Copyright [yyyy] [name of copyright owner]\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     \r\n   implied.\r\n   \r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n\r\n\r\n\n--------------------------------------------------------------------------------\nxanzy/go-cloudstack  Apache License 2.0  https://github.com/xanzy/go-cloudstack/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n--------------------------------------------------------------------------------\nxiang90/probing  MIT License  https://github.com/xiang90/probing/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Xiang Li\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n--------------------------------------------------------------------------------\nxlab/handysort  MIT License  https://github.com/xlab/handysort/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Maxim Kupriianov <max@kc.vc>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n--------------------------------------------------------------------------------\nxordataexchange/crypt  MIT License  https://github.com/xordataexchange/crypt/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 XOR Data Exchange, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\ncensus-instrumentation/opencensus-go  Apache License 2.0  https://github.com/census-instrumentation/opencensus-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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--------------------------------------------------------------------------------\nuber-go/atomic  MIT License  https://github.com/uber-go/atomic/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nCopyright (c) 2016 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nuber-go/multierr  MIT License  https://github.com/uber-go/multierr/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nCopyright (c) 2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nuber-go/tools  MIT License  https://github.com/uber-go/tools/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\nuber-go/zap  MIT License  https://github.com/uber-go/zap/blob/master/LICENSE.txt\n--------------------------------------------------------------------------------\nCopyright (c) 2016-2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\ngolang/crypto  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/crypto/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/exp  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/exp/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/image  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/image/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/mobile  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/mobile/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/mod  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/mod/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/net  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/net/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/oauth2  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/oauth2/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/sync  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/sync/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/sys  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/sys/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/text  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/text/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/time  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/time/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/tools  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/tools/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/xerrors  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/golang/xerrors/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2019 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngomodules/jsonpatch  Apache License 2.0  https://github.com/gomodules/jsonpatch/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n\n--------------------------------------------------------------------------------\ngonum/gonum  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/gonum/gonum/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright ©2013 The Gonum Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the Gonum project nor the names of its authors and\n      contributors may be used to endorse or promote products derived from this\n      software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n--------------------------------------------------------------------------------\ngonum/netlib  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/gonum/netlib/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright ©2013 The gonum Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the gonum project nor the names of its authors and\n      contributors may be used to endorse or promote products derived from this\n      software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n--------------------------------------------------------------------------------\ngoogle/google-api-go-client  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/googleapis/google-api-go-client/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2011 Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngolang/appengine  Apache License 2.0  https://github.com/golang/appengine/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngoogle/go-genproto  Apache License 2.0  https://github.com/googleapis/go-genproto/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\ngrpc/grpc-go  Apache License 2.0  https://github.com/grpc/grpc-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nairbrake/gobrake  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/airbrake/gobrake/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2014 The Gobrake Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nalecthomas/kingpin  MIT License  https://github.com/alecthomas/kingpin/blob/master/COPYING\n--------------------------------------------------------------------------------\nCopyright (C) 2014 Alec Thomas\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\ngo-check/check  BSD 2-Clause \"Simplified\" License  https://github.com/go-check/check/blob/v1/LICENSE\n--------------------------------------------------------------------------------\nGocheck - A rich testing framework for Go\n \nCopyright (c) 2010-2013 Gustavo Niemeyer <gustavo@niemeyer.net>\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met: \n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer. \n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngo-errgo/errgo  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/go-errgo/errgo/blob/v1/LICENSE\n--------------------------------------------------------------------------------\nCopyright © 2013, Roger Peppe\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimer in the documentation\n      and/or other materials provided with the distribution.\n    * Neither the name of this project nor the names of its contributors\n      may be used to endorse or promote products derived from this software\n      without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngo-gcfg/gcfg  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/go-gcfg/gcfg/blob/v1/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go\nAuthors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngemnasium/logrus-airbrake-hook  MIT License  https://github.com/gemnasium/logrus-airbrake-hook/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2015 Gemnasium\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n--------------------------------------------------------------------------------\ngo-inf/inf  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/go-inf/inf/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go\nAuthors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nsquare/go-jose  Apache License 2.0  https://github.com/square/go-jose/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nsrc-d/go-billy  Apache License 2.0  https://github.com/src-d/go-billy/blob/master/LICENSE\n--------------------------------------------------------------------------------\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 2017 Sourced Technologies S.L.\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--------------------------------------------------------------------------------\nsrc-d/go-git-fixtures  Apache License 2.0  https://github.com/src-d/go-git-fixtures/blob/master/LICENSE\n--------------------------------------------------------------------------------\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 2017 Sourced Technologies, S.L.\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--------------------------------------------------------------------------------\nsrc-d/go-git  Apache License 2.0  https://github.com/src-d/go-git/blob/master/LICENSE\n--------------------------------------------------------------------------------\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 2018 Sourced Technologies, S.L.\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--------------------------------------------------------------------------------\ngo-tomb/tomb  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/go-tomb/tomb/blob/v1/LICENSE\n--------------------------------------------------------------------------------\ntomb - support for clean goroutine termination in Go.\n\nCopyright (c) 2010-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimer in the documentation\n      and/or other materials provided with the distribution.\n    * Neither the name of the copyright holder nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngo-warnings/warnings  BSD 2-Clause \"Simplified\" License  https://github.com/go-warnings/warnings/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2016 Péter Surányi.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ngo-yaml/yaml  Apache License 2.0  https://github.com/go-yaml/yaml/blob/v2/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\ngotestyourself/gotest.tools  Apache License 2.0  https://github.com/gotestyourself/gotest.tools/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2018 gotest.tools authors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n--------------------------------------------------------------------------------\ngo4org/grpc  BSD 3-Clause \"New\" or \"Revised\" License  https://github.com/go4org/grpc/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright 2014, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\ndominikh/go-tools  MIT License  https://github.com/dominikh/go-tools/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2016 Dominik Honnef\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n--------------------------------------------------------------------------------\nkubernetes/api  Apache License 2.0  https://github.com/kubernetes/api/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/apiextensions-apiserver  Apache License 2.0  https://github.com/kubernetes/apiextensions-apiserver/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/apimachinery  Apache License 2.0  https://github.com/kubernetes/apimachinery/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/apiserver  Apache License 2.0  https://github.com/kubernetes/apiserver/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/cli-runtime  Apache License 2.0  https://github.com/kubernetes/cli-runtime/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/client-go  Apache License 2.0  https://github.com/kubernetes/client-go/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/cloud-provider  Apache License 2.0  https://github.com/kubernetes/cloud-provider/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes/cluster-bootstrap  Apache License 2.0  https://github.com/kubernetes/cluster-bootstrap/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/code-generator  Apache License 2.0  https://github.com/kubernetes/code-generator/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/component-base  Apache License 2.0  https://github.com/kubernetes/component-base/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/cri-api  Apache License 2.0  https://github.com/kubernetes/cri-api/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes/csi-translation-lib  Apache License 2.0  https://github.com/kubernetes/csi-translation-lib/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes/gengo  Apache License 2.0  https://github.com/kubernetes/gengo/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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 2014 The Kubernetes Authors.\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--------------------------------------------------------------------------------\nkubernetes/heapster  Apache License 2.0  https://github.com/kubernetes-retired/heapster/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache 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\n--------------------------------------------------------------------------------\nkubernetes/klog  Apache License 2.0  https://github.com/kubernetes/klog/blob/master/LICENSE\n--------------------------------------------------------------------------------\nApache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-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\n--------------------------------------------------------------------------------\nkubernetes/kube-aggregator  Apache License 2.0  https://github.com/kubernetes/kube-aggregator/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/kube-controller-manager  Apache License 2.0  https://github.com/kubernetes/kube-controller-manager/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/kube-openapi  Apache License 2.0  https://github.com/kubernetes/kube-openapi/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/kube-proxy  Apache License 2.0  https://github.com/kubernetes/kube-proxy/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/kube-scheduler  Apache License 2.0  https://github.com/kubernetes/kube-scheduler/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/kubelet  Apache License 2.0  https://github.com/kubernetes/kubelet/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/kubernetes  Apache License 2.0  https://github.com/kubernetes/kubernetes/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/legacy-cloud-providers  Apache License 2.0  https://github.com/kubernetes/legacy-cloud-providers/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes/metrics  Apache License 2.0  https://github.com/kubernetes/metrics/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes/repo-infra  Apache License 2.0  https://github.com/kubernetes/repo-infra/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes/sample-apiserver  Apache License 2.0  https://github.com/kubernetes/sample-apiserver/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes/utils  Apache License 2.0  https://github.com/kubernetes/utils/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\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\n--------------------------------------------------------------------------------\nkubernetes-sigs/controller-runtime  Apache License 2.0  https://github.com/kubernetes-sigs/controller-runtime/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes-sigs/kustomize  Apache License 2.0  https://github.com/kubernetes-sigs/kustomize/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes-sigs/structured-merge-diff  Apache License 2.0  https://github.com/kubernetes-sigs/structured-merge-diff/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nkubernetes-sigs/testing_frameworks  Apache License 2.0  https://github.com/kubernetes-sigs/testing_frameworks/blob/master/LICENSE\n--------------------------------------------------------------------------------\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 2018 The Kubernetes Authors\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--------------------------------------------------------------------------------\nkubernetes-sigs/yaml  MIT License  https://github.com/kubernetes-sigs/yaml/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\n\nCopyright (c) 2014 Sam Ghods\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n--------------------------------------------------------------------------------\nsourcegraph/go-diff  MIT License  https://github.com/sourcegraph/go-diff/blob/master/LICENSE\n--------------------------------------------------------------------------------\nCopyright (c) 2014 Sourcegraph, Inc.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n-----------------------------------------------------------------\n\nPortions adapted from python-unidiff:\n\nCopyright (c) 2012 Matias Bordese\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\n--------------------------------------------------------------------------------\nsqs/pbtypes  Apache License 2.0  https://github.com/sqs/pbtypes/blob/master/LICENSE\n--------------------------------------------------------------------------------\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\n--------------------------------------------------------------------------------\nfvbommel/util  MIT License  https://github.com/fvbommel/util/blob/master/LICENSE\n--------------------------------------------------------------------------------\nThe MIT License (MIT)\nCopyright (c) 2015 Frits van Bommel\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\nbitbucket.org/bertimus9/systemstat  MIT License  https://bitbucket.org/bertimus9/systemstat/src/master/LICENSE\n--------------------------------------------------------------------------------\n<!DOCTYPE html>\n<html lang=\"en\">\n  \n  \n  \n  \n  \n  <head>\n    <meta id=\"bb-bootstrap\" data-current-user=\"{&quot;isKbdShortcutsEnabled&quot;: true, &quot;isSshEnabled&quot;: false, &quot;isAuthenticated&quot;: false}\"\n />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Bitbucket</title>\n    <script nonce=\"pGz0PDmRcVGZXZn5\" type=\"text/javascript\">(window.NREUM||(NREUM={})).loader_config={xpid:\"VwMGVVZSGwIIUFBQDwU=\",licenseKey:\"a2cef8c3d3\",applicationID:\"1841284\"};window.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o||e)},o,o.exports)}return e[n].exports}if(\"function\"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({1:[function(t,e,n){function r(t){try{s.console&&console.log(t)}catch(e){}}var o,i=t(\"ee\"),a=t(24),s={};try{o=localStorage.getItem(\"__nr_flags\").split(\",\"),console&&\"function\"==typeof console.log&&(s.console=!0,o.indexOf(\"dev\")!==-1&&(s.dev=!0),o.indexOf(\"nr_dev\")!==-1&&(s.nrDev=!0))}catch(c){}s.nrDev&&i.on(\"internal-error\",function(t){r(t.stack)}),s.dev&&i.on(\"fn-err\",function(t,e,n){r(n.stack)}),s.dev&&(r(\"NR AGENT IN DEVELOPMENT MODE\"),r(\"flags: \"+a(s,function(t,e){return t}).join(\", \")))},{}],2:[function(t,e,n){function r(t,e,n,r,s){try{l?l-=1:o(s||new UncaughtException(t,e,n),!0)}catch(f){try{i(\"ierr\",[f,c.now(),!0])}catch(d){}}return\"function\"==typeof u&&u.apply(this,a(arguments))}function UncaughtException(t,e,n){this.message=t||\"Uncaught error with no additional information\",this.sourceURL=e,this.line=n}function o(t,e){var n=e?null:c.now();i(\"err\",[t,n])}var i=t(\"handle\"),a=t(25),s=t(\"ee\"),c=t(\"loader\"),f=t(\"gos\"),u=window.onerror,d=!1,p=\"nr@seenError\",l=0;c.features.err=!0,t(1),window.onerror=r;try{throw new Error}catch(h){\"stack\"in h&&(t(13),t(12),\"addEventListener\"in window&&t(6),c.xhrWrappable&&t(14),d=!0)}s.on(\"fn-start\",function(t,e,n){d&&(l+=1)}),s.on(\"fn-err\",function(t,e,n){d&&!n[p]&&(f(n,p,function(){return!0}),this.thrown=!0,o(n))}),s.on(\"fn-end\",function(){d&&!this.thrown&&l>0&&(l-=1)}),s.on(\"internal-error\",function(t){i(\"ierr\",[t,c.now(),!0])})},{}],3:[function(t,e,n){t(\"loader\").features.ins=!0},{}],4:[function(t,e,n){function r(){L++,C=g.hash,this[u]=y.now()}function o(){L--,g.hash!==C&&i(0,!0);var t=y.now();this[h]=~~this[h]+t-this[u],this[d]=t}function i(t,e){E.emit(\"newURL\",[\"\"+g,e])}function a(t,e){t.on(e,function(){this[e]=y.now()})}var s=\"-start\",c=\"-end\",f=\"-body\",u=\"fn\"+s,d=\"fn\"+c,p=\"cb\"+s,l=\"cb\"+c,h=\"jsTime\",m=\"fetch\",v=\"addEventListener\",w=window,g=w.location,y=t(\"loader\");if(w[v]&&y.xhrWrappable){var x=t(10),b=t(11),E=t(8),O=t(6),R=t(13),P=t(7),N=t(14),T=t(9),M=t(\"ee\"),S=M.get(\"tracer\");t(16),y.features.spa=!0;var C,L=0;M.on(u,r),M.on(p,r),M.on(d,o),M.on(l,o),M.buffer([u,d,\"xhr-done\",\"xhr-resolved\"]),O.buffer([u]),R.buffer([\"setTimeout\"+c,\"clearTimeout\"+s,u]),N.buffer([u,\"new-xhr\",\"send-xhr\"+s]),P.buffer([m+s,m+\"-done\",m+f+s,m+f+c]),E.buffer([\"newURL\"]),x.buffer([u]),b.buffer([\"propagate\",p,l,\"executor-err\",\"resolve\"+s]),S.buffer([u,\"no-\"+u]),T.buffer([\"new-jsonp\",\"cb-start\",\"jsonp-error\",\"jsonp-end\"]),a(N,\"send-xhr\"+s),a(M,\"xhr-resolved\"),a(M,\"xhr-done\"),a(P,m+s),a(P,m+\"-done\"),a(T,\"new-jsonp\"),a(T,\"jsonp-end\"),a(T,\"cb-start\"),E.on(\"pushState-end\",i),E.on(\"replaceState-end\",i),w[v](\"hashchange\",i,!0),w[v](\"load\",i,!0),w[v](\"popstate\",function(){i(0,L>1)},!0)}},{}],5:[function(t,e,n){function r(t){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var o=t(\"ee\"),i=t(\"handle\"),a=t(13),s=t(12),c=\"learResourceTimings\",f=\"addEventListener\",u=\"resourcetimingbufferfull\",d=\"bstResource\",p=\"resource\",l=\"-start\",h=\"-end\",m=\"fn\"+l,v=\"fn\"+h,w=\"bstTimer\",g=\"pushState\",y=t(\"loader\");y.features.stn=!0,t(8),\"addEventListener\"in window&&t(6);var x=NREUM.o.EV;o.on(m,function(t,e){var n=t[0];n instanceof x&&(this.bstStart=y.now())}),o.on(v,function(t,e){var n=t[0];n instanceof x&&i(\"bst\",[n,e,this.bstStart,y.now()])}),a.on(m,function(t,e,n){this.bstStart=y.now(),this.bstType=n}),a.on(v,function(t,e){i(w,[e,this.bstStart,y.now(),this.bstType])}),s.on(m,function(){this.bstStart=y.now()}),s.on(v,function(t,e){i(w,[e,this.bstStart,y.now(),\"requestAnimationFrame\"])}),o.on(g+l,function(t){this.time=y.now(),this.startPath=location.pathname+location.hash}),o.on(g+h,function(t){i(\"bstHist\",[location.pathname+location.hash,this.startPath,this.time])}),f in window.performance&&(window.performance[\"c\"+c]?window.performance[f](u,function(t){i(d,[window.performance.getEntriesByType(p)]),window.performance[\"c\"+c]()},!1):window.performance[f](\"webkit\"+u,function(t){i(d,[window.performance.getEntriesByType(p)]),window.performance[\"webkitC\"+c]()},!1)),document[f](\"scroll\",r,{passive:!0}),document[f](\"keypress\",r,!1),document[f](\"click\",r,!1)}},{}],6:[function(t,e,n){function r(t){for(var e=t;e&&!e.hasOwnProperty(u);)e=Object.getPrototypeOf(e);e&&o(e)}function o(t){s.inPlace(t,[u,d],\"-\",i)}function i(t,e){return t[1]}var a=t(\"ee\").get(\"events\"),s=t(\"wrap-function\")(a,!0),c=t(\"gos\"),f=XMLHttpRequest,u=\"addEventListener\",d=\"removeEventListener\";e.exports=a,\"getPrototypeOf\"in Object?(r(document),r(window),r(f.prototype)):f.prototype.hasOwnProperty(u)&&(o(window),o(f.prototype)),a.on(u+\"-start\",function(t,e){var n=t[1],r=c(n,\"nr@wrapped\",function(){function t(){if(\"function\"==typeof n.handleEvent)return n.handleEvent.apply(n,arguments)}var e={object:t,\"function\":n}[typeof n];return e?s(e,\"fn-\",null,e.name||\"anonymous\"):n});this.wrapped=t[1]=r}),a.on(d+\"-start\",function(t){t[1]=this.wrapped||t[1]})},{}],7:[function(t,e,n){function r(t,e,n){var r=t[e];\"function\"==typeof r&&(t[e]=function(){var t=i(arguments),e={};o.emit(n+\"before-start\",[t],e);var a;e[m]&&e[m].dt&&(a=e[m].dt);var s=r.apply(this,t);return o.emit(n+\"start\",[t,a],s),s.then(function(t){return o.emit(n+\"end\",[null,t],s),t},function(t){throw o.emit(n+\"end\",[t],s),t})})}var o=t(\"ee\").get(\"fetch\"),i=t(25),a=t(24);e.exports=o;var s=window,c=\"fetch-\",f=c+\"body-\",u=[\"arrayBuffer\",\"blob\",\"json\",\"text\",\"formData\"],d=s.Request,p=s.Response,l=s.fetch,h=\"prototype\",m=\"nr@context\";d&&p&&l&&(a(u,function(t,e){r(d[h],e,f),r(p[h],e,f)}),r(s,\"fetch\",c),o.on(c+\"end\",function(t,e){var n=this;if(e){var r=e.headers.get(\"content-length\");null!==r&&(n.rxSize=r),o.emit(c+\"done\",[null,e],n)}else o.emit(c+\"done\",[t],n)}))},{}],8:[function(t,e,n){var r=t(\"ee\").get(\"history\"),o=t(\"wrap-function\")(r);e.exports=r;var i=window.history&&window.history.constructor&&window.history.constructor.prototype,a=window.history;i&&i.pushState&&i.replaceState&&(a=i),o.inPlace(a,[\"pushState\",\"replaceState\"],\"-\")},{}],9:[function(t,e,n){function r(t){function e(){c.emit(\"jsonp-end\",[],p),t.removeEventListener(\"load\",e,!1),t.removeEventListener(\"error\",n,!1)}function n(){c.emit(\"jsonp-error\",[],p),c.emit(\"jsonp-end\",[],p),t.removeEventListener(\"load\",e,!1),t.removeEventListener(\"error\",n,!1)}var r=t&&\"string\"==typeof t.nodeName&&\"script\"===t.nodeName.toLowerCase();if(r){var o=\"function\"==typeof t.addEventListener;if(o){var a=i(t.src);if(a){var u=s(a),d=\"function\"==typeof u.parent[u.key];if(d){var p={};f.inPlace(u.parent,[u.key],\"cb-\",p),t.addEventListener(\"load\",e,!1),t.addEventListener(\"error\",n,!1),c.emit(\"new-jsonp\",[t.src],p)}}}}}function o(){return\"addEventListener\"in window}function i(t){var e=t.match(u);return e?e[1]:null}function a(t,e){var n=t.match(p),r=n[1],o=n[3];return o?a(o,e[r]):e[r]}function s(t){var e=t.match(d);return e&&e.length>=3?{key:e[2],parent:a(e[1],window)}:{key:t,parent:window}}var c=t(\"ee\").get(\"jsonp\"),f=t(\"wrap-function\")(c);if(e.exports=c,o()){var u=/[?&](?:callback|cb)=([^&#]+)/,d=/(.*)\\.([^.]+)/,p=/^(\\w+)(\\.|$)(.*)$/,l=[\"appendChild\",\"insertBefore\",\"replaceChild\"];Node&&Node.prototype&&Node.prototype.appendChild?f.inPlace(Node.prototype,l,\"dom-\"):(f.inPlace(HTMLElement.prototype,l,\"dom-\"),f.inPlace(HTMLHeadElement.prototype,l,\"dom-\"),f.inPlace(HTMLBodyElement.prototype,l,\"dom-\")),c.on(\"dom-start\",function(t){r(t[0])})}},{}],10:[function(t,e,n){var r=t(\"ee\").get(\"mutation\"),o=t(\"wrap-function\")(r),i=NREUM.o.MO;e.exports=r,i&&(window.MutationObserver=function(t){return this instanceof i?new i(o(t,\"fn-\")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype)},{}],11:[function(t,e,n){function r(t){var e=a.context(),n=s(t,\"executor-\",e),r=new f(n);return a.context(r).getCtx=function(){return e},a.emit(\"new-promise\",[r,e],e),r}function o(t,e){return e}var i=t(\"wrap-function\"),a=t(\"ee\").get(\"promise\"),s=i(a),c=t(24),f=NREUM.o.PR;e.exports=a,f&&(window.Promise=r,[\"all\",\"race\"].forEach(function(t){var e=f[t];f[t]=function(n){function r(t){return function(){a.emit(\"propagate\",[null,!o],i),o=o||!t}}var o=!1;c(n,function(e,n){Promise.resolve(n).then(r(\"all\"===t),r(!1))});var i=e.apply(f,arguments),s=f.resolve(i);return s}}),[\"resolve\",\"reject\"].forEach(function(t){var e=f[t];f[t]=function(t){var n=e.apply(f,arguments);return t!==n&&a.emit(\"propagate\",[t,!0],n),n}}),f.prototype[\"catch\"]=function(t){return this.then(null,t)},f.prototype=Object.create(f.prototype,{constructor:{value:r}}),c(Object.getOwnPropertyNames(f),function(t,e){try{r[e]=f[e]}catch(n){}}),a.on(\"executor-start\",function(t){t[0]=s(t[0],\"resolve-\",this),t[1]=s(t[1],\"resolve-\",this)}),a.on(\"executor-err\",function(t,e,n){t[1](n)}),s.inPlace(f.prototype,[\"then\"],\"then-\",o),a.on(\"then-start\",function(t,e){this.promise=e,t[0]=s(t[0],\"cb-\",this),t[1]=s(t[1],\"cb-\",this)}),a.on(\"then-end\",function(t,e,n){this.nextPromise=n;var r=this.promise;a.emit(\"propagate\",[r,!0],n)}),a.on(\"cb-end\",function(t,e,n){a.emit(\"propagate\",[n,!0],this.nextPromise)}),a.on(\"propagate\",function(t,e,n){this.getCtx&&!e||(this.getCtx=function(){if(t instanceof Promise)var e=a.context(t);return e&&e.getCtx?e.getCtx():this})}),r.toString=function(){return\"\"+f})},{}],12:[function(t,e,n){var r=t(\"ee\").get(\"raf\"),o=t(\"wrap-function\")(r),i=\"equestAnimationFrame\";e.exports=r,o.inPlace(window,[\"r\"+i,\"mozR\"+i,\"webkitR\"+i,\"msR\"+i],\"raf-\"),r.on(\"raf-start\",function(t){t[0]=o(t[0],\"fn-\")})},{}],13:[function(t,e,n){function r(t,e,n){t[0]=a(t[0],\"fn-\",null,n)}function o(t,e,n){this.method=n,this.timerDuration=isNaN(t[1])?0:+t[1],t[0]=a(t[0],\"fn-\",this,n)}var i=t(\"ee\").get(\"timer\"),a=t(\"wrap-function\")(i),s=\"setTimeout\",c=\"setInterval\",f=\"clearTimeout\",u=\"-start\",d=\"-\";e.exports=i,a.inPlace(window,[s,\"setImmediate\"],s+d),a.inPlace(window,[c],c+d),a.inPlace(window,[f,\"clearImmediate\"],f+d),i.on(c+u,r),i.on(s+u,o)},{}],14:[function(t,e,n){function r(t,e){d.inPlace(e,[\"onreadystatechange\"],\"fn-\",s)}function o(){var t=this,e=u.context(t);t.readyState>3&&!e.resolved&&(e.resolved=!0,u.emit(\"xhr-resolved\",[],t)),d.inPlace(t,g,\"fn-\",s)}function i(t){y.push(t),h&&(b?b.then(a):v?v(a):(E=-E,O.data=E))}function a(){for(var t=0;t<y.length;t++)r([],y[t]);y.length&&(y=[])}function s(t,e){return e}function c(t,e){for(var n in t)e[n]=t[n];return e}t(6);var f=t(\"ee\"),u=f.get(\"xhr\"),d=t(\"wrap-function\")(u),p=NREUM.o,l=p.XHR,h=p.MO,m=p.PR,v=p.SI,w=\"readystatechange\",g=[\"onload\",\"onerror\",\"onabort\",\"onloadstart\",\"onloadend\",\"onprogress\",\"ontimeout\"],y=[];e.exports=u;var x=window.XMLHttpRequest=function(t){var e=new l(t);try{u.emit(\"new-xhr\",[e],e),e.addEventListener(w,o,!1)}catch(n){try{u.emit(\"internal-error\",[n])}catch(r){}}return e};if(c(l,x),x.prototype=l.prototype,d.inPlace(x.prototype,[\"open\",\"send\"],\"-xhr-\",s),u.on(\"send-xhr-start\",function(t,e){r(t,e),i(e)}),u.on(\"open-xhr-start\",r),h){var b=m&&m.resolve();if(!v&&!m){var E=1,O=document.createTextNode(E);new h(a).observe(O,{characterData:!0})}}else f.on(\"fn-end\",function(t){t[0]&&t[0].type===w||a()})},{}],15:[function(t,e,n){function r(t){if(!i(t))return null;var e=window.NREUM;if(!e.loader_config)return null;var n=(e.loader_config.accountID||\"\").toString()||null,r=(e.loader_config.agentID||\"\").toString()||null,s=(e.loader_config.trustKey||\"\").toString()||null;if(!n||!r)return null;var c=a.generateCatId(),f=a.generateCatId(),u=Date.now(),d=o(c,f,u,n,r,s);return{header:d,guid:c,traceId:f,timestamp:u}}function o(t,e,n,r,o,i){var a=\"btoa\"in window&&\"function\"==typeof window.btoa;if(!a)return null;var s={v:[0,1],d:{ty:\"Browser\",ac:r,ap:o,id:t,tr:e,ti:n}};return i&&r!==i&&(s.d.tk=i),btoa(JSON.stringify(s))}function i(t){var e=!1,n=!1,r={};if(\"init\"in NREUM&&\"distributed_tracing\"in NREUM.init&&(r=NREUM.init.distributed_tracing,n=!!r.enabled),n)if(t.sameOrigin)e=!0;else if(r.allowed_origins instanceof Array)for(var o=0;o<r.allowed_origins.length;o++){var i=s(r.allowed_origins[o]);if(t.hostname===i.hostname&&t.protocol===i.protocol&&t.port===i.port){e=!0;break}}return n&&e}var a=t(22),s=t(17);e.exports={generateTracePayload:r,shouldGenerateTrace:i}},{}],16:[function(t,e,n){function r(t){var e=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var r=0;r<l;r++)t.removeEventListener(p[r],this.listener,!1);e.aborted||(n.duration=s.now()-this.startTime,this.loadCaptureCalled||4!==t.readyState?null==e.status&&(e.status=0):a(this,t),n.cbTime=this.cbTime,d.emit(\"xhr-done\",[t],t),c(\"xhr\",[e,n,this.startTime]))}}function o(t,e){var n=t.responseType;if(\"json\"===n&&null!==e)return e;var r=\"arraybuffer\"===n||\"blob\"===n||\"json\"===n?t.response:t.responseText;return v(r)}function i(t,e){var n=f(e),r=t.params;r.host=n.hostname+\":\"+n.port,r.pathname=n.pathname,t.parsedOrigin=f(e),t.sameOrigin=t.parsedOrigin.sameOrigin}function a(t,e){t.params.status=e.status;var n=o(e,t.lastSize);if(n&&(t.metrics.rxSize=n),t.sameOrigin){var r=e.getResponseHeader(\"X-NewRelic-App-Data\");r&&(t.params.cat=r.split(\", \").pop())}t.loadCaptureCalled=!0}var s=t(\"loader\");if(s.xhrWrappable){var c=t(\"handle\"),f=t(17),u=t(15).generateTracePayload,d=t(\"ee\"),p=[\"load\",\"error\",\"abort\",\"timeout\"],l=p.length,h=t(\"id\"),m=t(20),v=t(19),w=window.XMLHttpRequest;s.features.xhr=!0,t(14),t(7),d.on(\"new-xhr\",function(t){var e=this;e.totalCbs=0,e.called=0,e.cbTime=0,e.end=r,e.ended=!1,e.xhrGuids={},e.lastSize=null,e.loadCaptureCalled=!1,t.addEventListener(\"load\",function(n){a(e,t)},!1),m&&(m>34||m<10)||window.opera||t.addEventListener(\"progress\",function(t){e.lastSize=t.loaded},!1)}),d.on(\"open-xhr-start\",function(t){this.params={method:t[0]},i(this,t[1]),this.metrics={}}),d.on(\"open-xhr-end\",function(t,e){\"loader_config\"in NREUM&&\"xpid\"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader(\"X-NewRelic-ID\",NREUM.loader_config.xpid);var n=u(this.parsedOrigin);n&&n.header&&(e.setRequestHeader(\"newrelic\",n.header),this.dt=n)}),d.on(\"send-xhr-start\",function(t,e){var n=this.metrics,r=t[0],o=this;if(n&&r){var i=v(r);i&&(n.txSize=i)}this.startTime=s.now(),this.listener=function(t){try{\"abort\"!==t.type||o.loadCaptureCalled||(o.params.aborted=!0),(\"load\"!==t.type||o.called===o.totalCbs&&(o.onloadCalled||\"function\"!=typeof e.onload))&&o.end(e)}catch(n){try{d.emit(\"internal-error\",[n])}catch(r){}}};for(var a=0;a<l;a++)e.addEventListener(p[a],this.listener,!1)}),d.on(\"xhr-cb-time\",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&\"function\"==typeof n.onload||this.end(n)}),d.on(\"xhr-load-added\",function(t,e){var n=\"\"+h(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),d.on(\"xhr-load-removed\",function(t,e){var n=\"\"+h(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),d.on(\"addEventListener-end\",function(t,e){e instanceof w&&\"load\"===t[0]&&d.emit(\"xhr-load-added\",[t[1],t[2]],e)}),d.on(\"removeEventListener-end\",function(t,e){e instanceof w&&\"load\"===t[0]&&d.emit(\"xhr-load-removed\",[t[1],t[2]],e)}),d.on(\"fn-start\",function(t,e,n){e instanceof w&&(\"onload\"===n&&(this.onload=!0),(\"load\"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=s.now()))}),d.on(\"fn-end\",function(t,e){this.xhrCbStart&&d.emit(\"xhr-cb-time\",[s.now()-this.xhrCbStart,this.onload,e],e)}),d.on(\"fetch-before-start\",function(t){var e,n=t[1]||{};\"string\"==typeof t[0]?e=t[0]:t[0]&&t[0].url&&(e=t[0].url),e&&(this.parsedOrigin=f(e),this.sameOrigin=this.parsedOrigin.sameOrigin);var r=u(this.parsedOrigin);if(r&&r.header){var o=r.header;if(\"string\"==typeof t[0]){var i={};for(var a in n)i[a]=n[a];i.headers=new Headers(n.headers||{}),i.headers.set(\"newrelic\",o),this.dt=r,t.length>1?t[1]=i:t.push(i)}else t[0]&&t[0].headers&&(t[0].headers.append(\"newrelic\",o),this.dt=r)}})}},{}],17:[function(t,e,n){var r={};e.exports=function(t){if(t in r)return r[t];var e=document.createElement(\"a\"),n=window.location,o={};e.href=t,o.port=e.port;var i=e.href.split(\"://\");!o.port&&i[1]&&(o.port=i[1].split(\"/\")[0].split(\"@\").pop().split(\":\")[1]),o.port&&\"0\"!==o.port||(o.port=\"https\"===i[0]?\"443\":\"80\"),o.hostname=e.hostname||n.hostname,o.pathname=e.pathname,o.protocol=i[0],\"/\"!==o.pathname.charAt(0)&&(o.pathname=\"/\"+o.pathname);var a=!e.protocol||\":\"===e.protocol||e.protocol===n.protocol,s=e.hostname===document.domain&&e.port===n.port;return o.sameOrigin=a&&(!e.hostname||s),\"/\"===o.pathname&&(r[t]=o),o}},{}],18:[function(t,e,n){function r(){}function o(t,e,n){return function(){return i(t,[f.now()].concat(s(arguments)),e?null:this,n),e?void 0:this}}var i=t(\"handle\"),a=t(24),s=t(25),c=t(\"ee\").get(\"tracer\"),f=t(\"loader\"),u=NREUM;\"undefined\"==typeof window.newrelic&&(newrelic=u);var d=[\"setPageViewName\",\"setCustomAttribute\",\"setErrorHandler\",\"finished\",\"addToTrace\",\"inlineHit\",\"addRelease\"],p=\"api-\",l=p+\"ixn-\";a(d,function(t,e){u[e]=o(p+e,!0,\"api\")}),u.addPageAction=o(p+\"addPageAction\",!0),u.setCurrentRouteName=o(p+\"routeName\",!0),e.exports=newrelic,u.interaction=function(){return(new r).get()};var h=r.prototype={createTracer:function(t,e){var n={},r=this,o=\"function\"==typeof e;return i(l+\"tracer\",[f.now(),t,n],r),function(){if(c.emit((o?\"\":\"no-\")+\"fn-start\",[f.now(),r,o],n),o)try{return e.apply(this,arguments)}catch(t){throw c.emit(\"fn-err\",[arguments,this,t],n),t}finally{c.emit(\"fn-end\",[f.now()],n)}}}};a(\"actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get\".split(\",\"),function(t,e){h[e]=o(l+e)}),newrelic.noticeError=function(t,e){\"string\"==typeof t&&(t=new Error(t)),i(\"err\",[t,f.now(),!1,e])}},{}],19:[function(t,e,n){e.exports=function(t){if(\"string\"==typeof t&&t.length)return t.length;if(\"object\"==typeof t){if(\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if(\"undefined\"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!(\"undefined\"!=typeof FormData&&t instanceof FormData))try{return JSON.stringify(t).length}catch(e){return}}}},{}],20:[function(t,e,n){var r=0,o=navigator.userAgent.match(/Firefox[\\/\\s](\\d+\\.\\d+)/);o&&(r=+o[1]),e.exports=r},{}],21:[function(t,e,n){function r(t,e){var n=t.getEntries();n.forEach(function(t){\"first-paint\"===t.name?a(\"timing\",[\"fp\",Math.floor(t.startTime)]):\"first-contentful-paint\"===t.name&&a(\"timing\",[\"fcp\",Math.floor(t.startTime)])})}function o(t){if(t instanceof c&&!u){var e,n=Math.round(t.timeStamp);e=n>1e12?Date.now()-n:s.now()-n,u=!0,a(\"timing\",[\"fi\",n,{type:t.type,fid:e}])}}if(!(\"init\"in NREUM&&\"page_view_timing\"in NREUM.init&&\"enabled\"in NREUM.init.page_view_timing&&NREUM.init.page_view_timing.enabled===!1)){var i,a=t(\"handle\"),s=t(\"loader\"),c=NREUM.o.EV;if(\"PerformanceObserver\"in window&&\"function\"==typeof window.PerformanceObserver){i=new PerformanceObserver(r);try{i.observe({entryTypes:[\"paint\"]})}catch(f){}}if(\"addEventListener\"in document){var u=!1,d=[\"click\",\"keydown\",\"mousedown\",\"pointerdown\",\"touchstart\"];d.forEach(function(t){document.addEventListener(t,o,!1)})}}},{}],22:[function(t,e,n){function r(){function t(){return e?15&e[n++]:16*Math.random()|0}var e=null,n=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&(e=r.getRandomValues(new Uint8Array(31)));for(var o,i=\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\",a=\"\",s=0;s<i.length;s++)o=i[s],\"x\"===o?a+=t().toString(16):\"y\"===o?(o=3&t()|8,a+=o.toString(16)):a+=o;return a}function o(){function t(){return e?15&e[n++]:16*Math.random()|0}var e=null,n=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&Uint8Array&&(e=r.getRandomValues(new Uint8Array(31)));for(var o=[],i=0;i<16;i++)o.push(t().toString(16));return o.join(\"\")}e.exports={generateUuid:r,generateCatId:o}},{}],23:[function(t,e,n){function r(t,e){if(!o)return!1;if(t!==o)return!1;if(!e)return!0;if(!i)return!1;for(var n=i.split(\".\"),r=e.split(\".\"),a=0;a<r.length;a++)if(r[a]!==n[a])return!1;return!0}var o=null,i=null,a=/Version\\/(\\S+)\\s+Safari/;if(navigator.userAgent){var s=navigator.userAgent,c=s.match(a);c&&s.indexOf(\"Chrome\")===-1&&s.indexOf(\"Chromium\")===-1&&(o=\"Safari\",i=c[1])}e.exports={agent:o,version:i,match:r}},{}],24:[function(t,e,n){function r(t,e){var n=[],r=\"\",i=0;for(r in t)o.call(t,r)&&(n[i]=e(r,t[r]),i+=1);return n}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],25:[function(t,e,n){function r(t,e,n){e||(e=0),\"undefined\"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(o<0?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=r},{}],26:[function(t,e,n){e.exports={exists:\"undefined\"!=typeof window.performance&&window.performance.timing&&\"undefined\"!=typeof window.performance.timing.navigationStart}},{}],ee:[function(t,e,n){function r(){}function o(t){function e(t){return t&&t instanceof r?t:t?c(t,s,i):i()}function n(n,r,o,i){if(!p.aborted||i){t&&t(n,r,o);for(var a=e(o),s=m(n),c=s.length,f=0;f<c;f++)s[f].apply(a,r);var d=u[y[n]];return d&&d.push([x,n,r,a]),a}}function l(t,e){g[t]=m(t).concat(e)}function h(t,e){var n=g[t];if(n)for(var r=0;r<n.length;r++)n[r]===e&&n.splice(r,1)}function m(t){return g[t]||[]}function v(t){return d[t]=d[t]||o(n)}function w(t,e){f(t,function(t,n){e=e||\"feature\",y[n]=e,e in u||(u[e]=[])})}var g={},y={},x={on:l,addEventListener:l,removeEventListener:h,emit:n,get:v,listeners:m,context:e,buffer:w,abort:a,aborted:!1};return x}function i(){return new r}function a(){(u.api||u.feature)&&(p.aborted=!0,u=p.backlog={})}var s=\"nr@context\",c=t(\"gos\"),f=t(24),u={},d={},p=e.exports=o();p.backlog=u},{}],gos:[function(t,e,n){function r(t,e,n){if(o.call(t,e))return t[e];var r=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return t[e]=r,r}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],handle:[function(t,e,n){function r(t,e,n,r){o.buffer([t],r),o.emit(t,e,n)}var o=t(\"ee\").get(\"handle\");e.exports=r,r.ee=o},{}],id:[function(t,e,n){function r(t){var e=typeof t;return!t||\"object\"!==e&&\"function\"!==e?-1:t===window?0:a(t,i,function(){return o++})}var o=1,i=\"nr@id\",a=t(\"gos\");e.exports=r},{}],loader:[function(t,e,n){function r(){if(!E++){var t=b.info=NREUM.info,e=l.getElementsByTagName(\"script\")[0];if(setTimeout(u.abort,3e4),!(t&&t.licenseKey&&t.applicationID&&e))return u.abort();f(y,function(e,n){t[e]||(t[e]=n)}),c(\"mark\",[\"onload\",a()+b.offset],null,\"api\");var n=l.createElement(\"script\");n.src=\"https://\"+t.agent,e.parentNode.insertBefore(n,e)}}function o(){\"complete\"===l.readyState&&i()}function i(){c(\"mark\",[\"domContent\",a()+b.offset],null,\"api\")}function a(){return O.exists&&performance.now?Math.round(performance.now()):(s=Math.max((new Date).getTime(),s))-b.offset}var s=(new Date).getTime(),c=t(\"handle\"),f=t(24),u=t(\"ee\"),d=t(23),p=window,l=p.document,h=\"addEventListener\",m=\"attachEvent\",v=p.XMLHttpRequest,w=v&&v.prototype;NREUM.o={ST:setTimeout,SI:p.setImmediate,CT:clearTimeout,XHR:v,REQ:p.Request,EV:p.Event,PR:p.Promise,MO:p.MutationObserver};var g=\"\"+location,y={beacon:\"bam.nr-data.net\",errorBeacon:\"bam.nr-data.net\",agent:\"js-agent.newrelic.com/nr-spa-1158.min.js\"},x=v&&w&&w[h]&&!/CriOS/.test(navigator.userAgent),b=e.exports={offset:s,now:a,origin:g,features:{},xhrWrappable:x,userAgent:d};t(18),t(21),l[h]?(l[h](\"DOMContentLoaded\",i,!1),p[h](\"load\",r,!1)):(l[m](\"onreadystatechange\",o),p[m](\"onload\",r)),c(\"mark\",[\"firstbyte\",s],null,\"api\");var E=0,O=t(26)},{}],\"wrap-function\":[function(t,e,n){function r(t){return!(t&&t instanceof Function&&t.apply&&!t[a])}var o=t(\"ee\"),i=t(25),a=\"nr@original\",s=Object.prototype.hasOwnProperty,c=!1;e.exports=function(t,e){function n(t,e,n,o){function nrWrapper(){var r,a,s,c;try{a=this,r=i(arguments),s=\"function\"==typeof n?n(r,a):n||{}}catch(f){p([f,\"\",[r,a,o],s])}u(e+\"start\",[r,a,o],s);try{return c=t.apply(a,r)}catch(d){throw u(e+\"err\",[r,a,d],s),d}finally{u(e+\"end\",[r,a,c],s)}}return r(t)?t:(e||(e=\"\"),nrWrapper[a]=t,d(t,nrWrapper),nrWrapper)}function f(t,e,o,i){o||(o=\"\");var a,s,c,f=\"-\"===o.charAt(0);for(c=0;c<e.length;c++)s=e[c],a=t[s],r(a)||(t[s]=n(a,f?s+o:o,i,s))}function u(n,r,o){if(!c||e){var i=c;c=!0;try{t.emit(n,r,o,e)}catch(a){p([a,n,r,o])}c=i}}function d(t,e){if(Object.defineProperty&&Object.keys)try{var n=Object.keys(t);return n.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(r){p([r])}for(var o in t)s.call(t,o)&&(e[o]=t[o]);return e}function p(e){try{t.emit(\"internal-error\",e)}catch(n){}}return t||(t=o),n.inPlace=f,n.flag=a,n}},{}]},{},[\"loader\",2,16,5,3,4]);</script>\n    \n\n\n<meta name=\"bb-env\" content=\"production\" />\n<meta id=\"bb-canon-url\" name=\"bb-canon-url\" content=\"https://bitbucket.org\">\n<meta name=\"bb-api-canon-url\" content=\"https://api.bitbucket.org\">\n\n\n\n<meta name=\"bb-commit-hash\" content=\"57968ec42b99\">\n<meta name=\"bb-app-node\" content=\"app-1114\">\n<meta name=\"bb-view-name\" content=\"bitbucket.apps.repo2.views.SourceView\">\n<meta name=\"ignore-whitespace\" content=\"False\">\n<meta name=\"tab-size\" content=\"None\">\n<meta name=\"locale\" content=\"en\">\n<meta name=\"application-name\" content=\"Bitbucket\">\n<meta name=\"apple-mobile-web-app-title\" content=\"Bitbucket\">\n<meta name=\"slack-app-id\" content=\"A8W8QLZD1\">\n<meta name=\"statuspage-api-host\" content=\"https://bqlf8qjztdtr.statuspage.io\">\n\n\n<meta name=\"theme-color\" content=\"#0049B0\">\n<meta name=\"msapplication-TileColor\" content=\"#0052CC\">\n<meta name=\"msapplication-TileImage\" content=\"https://d301sr5gafysq2.cloudfront.net/57968ec42b99/img/logos/bitbucket/mstile-150x150.png\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" type=\"image/png\" href=\"https://d301sr5gafysq2.cloudfront.net/57968ec42b99/img/logos/bitbucket/apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"192x192\" type=\"image/png\" href=\"https://d301sr5gafysq2.cloudfront.net/57968ec42b99/img/logos/bitbucket/android-chrome-192x192.png\">\n\n<link rel=\"icon\" sizes=\"16x16 24x24 32x32 64x64\" type=\"image/x-icon\" href=\"/favicon.ico?v=2\">\n<link rel=\"mask-icon\" href=\"https://d301sr5gafysq2.cloudfront.net/57968ec42b99/img/logos/bitbucket/safari-pinned-tab.svg\" color=\"#0052CC\">\n\n<link rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"/opensearch.xml\" title=\"Bitbucket\">\n\n    <meta name=\"description\" content=\"\">\n    <meta name=\"bb-single-page-app\" content=\"true\">\n    \n    <script nonce=\"pGz0PDmRcVGZXZn5\">\n\nif (window.performance) {\n\n  \n  window.performance.okayToSendMetrics = !document.hidden && 'onvisibilitychange' in document;\n\n  if (window.performance.okayToSendMetrics) {\n\n    \n    window.addEventListener('visibilitychange', function () {\n      if (document.hidden) {\n        window.performance.okayToSendMetrics = false;\n      }\n    });\n  }\n}\n</script>\n    \n    \n      \n        <link rel=\"stylesheet\" href=\"https://d301sr5gafysq2.cloudfront.net/frontbucket/vendor.1e7fb924f5f8.css\">\n      \n      \n    \n    \n  </head>\n  <body>\n    <div id=\"root\">\n    \n    </div>\n    <script nonce=\"pGz0PDmRcVGZXZn5\">\n      window.__sentry__ = {\"dsn\": \"https://2dcda83904474d8c86928ebbfa1ab294@sentry.io/1480772\", \"environment\": \"production\"};\n      window.__initial_state__ = {\"section\": {\"repository\": {\"connectActions\": [], \"cloneProtocol\": \"https\", \"currentRepository\": {\"scm\": \"git\", \"website\": \"\", \"uuid\": \"{8db95fc4-8aaf-45f3-b223-1b5a8de14dff}\", \"links\": {\"clone\": [{\"href\": \"https://bitbucket.org/bertimus9/systemstat.git\", \"name\": \"https\"}, {\"href\": \"git@bitbucket.org:bertimus9/systemstat.git\", \"name\": \"ssh\"}], \"self\": {\"href\": \"https://bitbucket.org/!api/2.0/repositories/bertimus9/systemstat\"}, \"html\": {\"href\": \"https://bitbucket.org/bertimus9/systemstat\"}, \"avatar\": {\"href\": \"https://bytebucket.org/ravatar/%7B8db95fc4-8aaf-45f3-b223-1b5a8de14dff%7D?ts=go\"}}, \"name\": \"systemstat\", \"language\": \"go\", \"mainbranch\": {\"name\": \"master\"}, \"full_name\": \"bertimus9/systemstat\", \"owner\": {\"has_2fa_enabled\": null, \"display_name\": \"Phillip Bond\", \"uuid\": \"{d57aa881-4525-4da4-a558-64a0748659fc}\", \"links\": {\"self\": {\"href\": \"https://bitbucket.org/!api/2.0/users/%7Bd57aa881-4525-4da4-a558-64a0748659fc%7D\"}, \"html\": {\"href\": \"https://bitbucket.org/%7Bd57aa881-4525-4da4-a558-64a0748659fc%7D/\"}, \"avatar\": {\"href\": \"https://secure.gravatar.com/avatar/3f38bb5bcf218d87cdf2b9b5b4f76768?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FPB-2.png\"}}, \"type\": \"user\", \"created_on\": \"2013-07-20T05:40:55.690544+00:00\", \"is_staff\": false, \"account_status\": \"active\", \"nickname\": \"bertimus9\", \"properties\": {}, \"account_id\": \"557058:c82eba35-00b1-4407-a4a8-56e99903b63a\"}, \"updated_on\": \"2018-02-07T00:06:37.312614+00:00\", \"type\": \"repository\", \"slug\": \"systemstat\", \"is_private\": false, \"description\": \"Go package that allows you to add system statistics to your go program; currently polls the linux kernel for CPU usage, free/used memory and swap sizes, and uptime for your go process as well as the linux system you're running it on, as well as the system load. Can be used to make a crippled version of top that monitors the current go process and ignores other processes and the number of users with ttys.\"}, \"mirrors\": [], \"menuItems\": [{\"analytics_label\": \"repository.source\", \"is_client_link\": true, \"icon_class\": \"icon-source\", \"badge_label\": null, \"weight\": 200, \"url\": \"/bertimus9/systemstat/src\", \"tab_name\": \"source\", \"can_display\": true, \"label\": \"Source\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [\"/diff\", \"/history-node\"], \"target\": \"_self\", \"id\": \"repo-source-link\", \"icon\": \"icon-source\"}, {\"analytics_label\": \"repository.commits\", \"is_client_link\": true, \"icon_class\": \"icon-commits\", \"badge_label\": null, \"weight\": 300, \"url\": \"/bertimus9/systemstat/commits/\", \"tab_name\": \"commits\", \"can_display\": true, \"label\": \"Commits\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-commits-link\", \"icon\": \"icon-commits\"}, {\"analytics_label\": \"repository.branches\", \"is_client_link\": true, \"icon_class\": \"icon-branches\", \"badge_label\": null, \"weight\": 400, \"url\": \"/bertimus9/systemstat/branches/\", \"tab_name\": \"branches\", \"can_display\": true, \"label\": \"Branches\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-branches-link\", \"icon\": \"icon-branches\"}, {\"analytics_label\": \"repository.pullrequests\", \"is_client_link\": true, \"icon_class\": \"icon-pull-requests\", \"badge_label\": null, \"weight\": 500, \"url\": \"/bertimus9/systemstat/pull-requests/\", \"tab_name\": \"pullrequests\", \"can_display\": true, \"label\": \"Pull requests\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-pullrequests-link\", \"icon\": \"icon-pull-requests\"}, {\"analytics_label\": \"user.addon\", \"is_client_link\": true, \"icon_class\": \"aui-iconfont-unfocus\", \"badge_label\": null, \"weight\": 550, \"url\": \"/bertimus9/systemstat/addon/pipelines/home\", \"tab_name\": \"repopage-oB98xE-add-on-link\", \"can_display\": true, \"label\": \"Pipelines\", \"icon_url\": \"https://bitbucket-connect-icons.s3.amazonaws.com/add-on/icons/62acf41d-386f-49fd-b823-4f86445390e2.svg?AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&Expires=1579219808&Signature=rXZu8eJM3bOKeP7FXM8b5qYkFEo%3D\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"type\": \"connect_menu_item\", \"id\": \"repopage-oB98xE-add-on-link\", \"target\": \"_self\"}, {\"analytics_label\": \"user.addon\", \"is_client_link\": true, \"icon_class\": \"aui-iconfont-unfocus\", \"badge_label\": null, \"weight\": 560, \"url\": \"/bertimus9/systemstat/addon/pipelines/deployments\", \"tab_name\": \"repopage-yaM899-add-on-link\", \"can_display\": true, \"label\": \"Deployments\", \"icon_url\": \"https://bitbucket-connect-icons.s3.amazonaws.com/add-on/icons/fca72d46-7e20-4dc4-b6a8-c83fb9665cc6.svg?AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&Expires=1579219808&Signature=z0CJJOfJloETfgl8K1LOp6lXtbQ%3D\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"type\": \"connect_menu_item\", \"id\": \"repopage-yaM899-add-on-link\", \"target\": \"_self\"}, {\"analytics_label\": \"issues\", \"is_client_link\": false, \"icon_class\": \"icon-issues\", \"badge_label\": \"0 active issues\", \"weight\": 600, \"url\": \"/bertimus9/systemstat/issues?status=new&status=open\", \"tab_name\": \"issues\", \"can_display\": true, \"label\": \"Issues\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-issues-link\", \"icon\": \"icon-issues\"}, {\"analytics_label\": \"repository.wiki\", \"is_client_link\": false, \"icon_class\": \"icon-wiki\", \"badge_label\": null, \"weight\": 700, \"url\": \"/bertimus9/systemstat/wiki/\", \"tab_name\": \"wiki\", \"can_display\": true, \"label\": \"Wiki\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-wiki-link\", \"icon\": \"icon-wiki\"}, {\"analytics_label\": \"repository.downloads\", \"is_client_link\": false, \"icon_class\": \"icon-downloads\", \"badge_label\": null, \"weight\": 800, \"url\": \"/bertimus9/systemstat/downloads/\", \"tab_name\": \"downloads\", \"can_display\": true, \"label\": \"Downloads\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-downloads-link\", \"icon\": \"icon-downloads\"}], \"bitbucketActions\": [{\"analytics_label\": \"repository.clone\", \"is_client_link\": false, \"icon_class\": \"icon-clone\", \"badge_label\": null, \"weight\": 100, \"url\": \"#clone\", \"tab_name\": \"clone\", \"can_display\": true, \"label\": \"<strong>Clone<\\/strong> this repository\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-clone-button\", \"icon\": \"icon-clone\"}, {\"analytics_label\": \"repository.compare\", \"is_client_link\": false, \"icon_class\": \"aui-icon-small aui-iconfont-devtools-compare\", \"badge_label\": null, \"weight\": 400, \"url\": \"/bertimus9/systemstat/branches/compare\", \"tab_name\": \"compare\", \"can_display\": true, \"label\": \"<strong>Compare<\\/strong> branches or tags\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-compare-link\", \"icon\": \"aui-icon-small aui-iconfont-devtools-compare\"}, {\"analytics_label\": \"repository.fork\", \"is_client_link\": false, \"icon_class\": \"icon-fork\", \"badge_label\": null, \"weight\": 500, \"url\": \"/bertimus9/systemstat/fork\", \"tab_name\": \"fork\", \"can_display\": true, \"label\": \"<strong>Fork<\\/strong> this repository\", \"type\": \"menu_item\", \"anchor\": true, \"analytics_payload\": {}, \"matching_url_prefixes\": [], \"target\": \"_self\", \"id\": \"repo-fork-link\", \"icon\": \"icon-fork\"}], \"activeMenuItem\": \"source\"}}, \"global\": {\"needs_marketing_consent\": false, \"features\": {\"crf-skip-excessive-diffs\": true, \"bleach-snippets-and-wikis\": true, \"exp-share-to-invite-variation\": false, \"connect-authorize-key-or-descriptor\": true, \"pr-web-panels\": true, \"use-elasticache-lsn-storage\": true, \"workspaces-api-proxy\": true, \"lxml-sanitization\": true, \"atlassian-switcher\": true, \"account-switcher\": true, \"show-billing-errors\": true, \"restrict-commit-author-data\": true, \"whitelisted_throttle_exemption\": true, \"nav-add-file\": false, \"media-api-via-atlassian-proxy\": true, \"new-code-review-sync-now\": true, \"group-member-handler-bulk-users\": true, \"bbcs-367-log-session-invalidation\": true, \"repo-filtering-configuration-signal-enabled\": true, \"ignore-bb-notification\": true, \"auto-prs-prime-fallback\": true, \"diff-api-20-refactor\": true, \"enable-boto3-s3-backend\": true, \"enable-router-metrics\": true, \"lsn-based-db-routing\": true, \"repo-nav-jira-tab\": true, \"spa-plans-page\": true, \"clone-in-xcode\": true, \"create-pr-dialog\": true, \"unfiltered-repo-manager\": true, \"provisioning-auto-login\": true, \"disable-jsonp\": true, \"use-moneybucket\": true, \"statuspage-incident-message\": true, \"lsn-lookups\": true, \"block-bot-user-qs-permissions\": true, \"frontbucket-leave-repository\": true, \"new-source-browser\": true, \"markdown-and-linkify-commits\": true, \"one-trust-integration\": true, \"allow-bot-push\": true, \"block-bot-user-permissions\": true, \"fd-delete-github-token-on-acct-disconnect\": true, \"workspace-api\": true, \"disable-prs-sidecar\": true, \"provisioning-api-list-teams\": true, \"twofactor-recovery-flow\": true, \"hg-deprecation-warning\": true, \"fetch-sites-from-bb-jira-service\": true, \"allow-cloud-session\": true}, \"locale\": \"en\", \"geoip_country\": null, \"targetFeatures\": {\"crf-skip-excessive-diffs\": true, \"bleach-snippets-and-wikis\": true, \"new-code-review-activity-feed-02\": true, \"connect-authorize-key-or-descriptor\": true, \"pr-web-panels\": true, \"use-elasticache-lsn-storage\": true, \"workspaces-api-proxy\": true, \"fd-sidebar-code-insights\": false, \"lxml-sanitization\": true, \"workspace-api\": true, \"atlassian-switcher\": true, \"account-switcher\": true, \"new-code-review-revert-pr\": true, \"show-guidance-message\": true, \"show-billing-errors\": true, \"large-pr-rendering-limits\": true, \"restrict-commit-author-data\": true, \"whitelisted_throttle_exemption\": true, \"media-api-via-atlassian-proxy\": true, \"force-old-code-review\": false, \"new-code-review-sync-now\": true, \"markdown-embedded-html\": false, \"spa-profile-repository-list\": true, \"group-member-handler-bulk-users\": true, \"repo-filtering-configuration-signal-enabled\": true, \"pr-webitems\": true, \"bbcs-367-log-session-invalidation\": true, \"unfiltered-repo-manager\": true, \"clonebundles\": true, \"use-moneybucket\": true, \"pride-logo\": false, \"auto-prs-prime-fallback\": true, \"diff-api-20-refactor\": true, \"enable-boto3-s3-backend\": true, \"enable-router-metrics\": true, \"lsn-based-db-routing\": true, \"repo-nav-jira-tab\": true, \"growth-join-section-in-atlassian-switcher\": true, \"spa-plans-page\": true, \"clone-in-xcode\": true, \"create-pr-dialog\": true, \"terms-and-conditions-2018\": true, \"provisioning-auto-login\": true, \"prlinks-installer\": true, \"disable-jsonp\": true, \"fd-delete-github-token-on-acct-disconnect\": true, \"statuspage-incident-message\": true, \"exp-new-user-survey\": true, \"atlassian-editor\": true, \"block-bot-user-qs-permissions\": true, \"frontbucket-leave-repository\": true, \"new-source-browser\": true, \"ignore-bb-notification\": true, \"markdown-and-linkify-commits\": true, \"one-trust-integration\": true, \"allow-bot-push\": true, \"hg-deprecation-warning-flag\": true, \"block-bot-user-permissions\": true, \"evolution\": false, \"new-code-review\": false, \"lsn-lookups\": true, \"disable-prs-sidecar\": true, \"provisioning-api-list-teams\": true, \"growth-joinable-sites-calculation\": true, \"twofactor-recovery-flow\": true, \"hg-deprecation-warning\": true, \"fetch-sites-from-bb-jira-service\": true, \"new-code-review-tasks\": true, \"allow-cloud-session\": true}, \"isFocusedTask\": false, \"browser_monitoring\": true, \"identityPassthroughEnabled\": true, \"is_mobile_user_agent\": false, \"flags\": [], \"site_message\": \"\", \"isNavigationOpen\": true, \"path\": \"/bertimus9/systemstat/src/master/LICENSE\", \"focusedTaskBackButtonUrl\": null, \"targetUser\": {\"has_2fa_enabled\": null, \"display_name\": \"Phillip Bond\", \"uuid\": \"{d57aa881-4525-4da4-a558-64a0748659fc}\", \"links\": {\"self\": {\"href\": \"https://bitbucket.org/!api/2.0/users/%7Bd57aa881-4525-4da4-a558-64a0748659fc%7D\"}, \"html\": {\"href\": \"https://bitbucket.org/%7Bd57aa881-4525-4da4-a558-64a0748659fc%7D/\"}, \"avatar\": {\"href\": \"https://secure.gravatar.com/avatar/3f38bb5bcf218d87cdf2b9b5b4f76768?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FPB-2.png\"}}, \"type\": \"user\", \"created_on\": \"2013-07-20T05:40:55.690544+00:00\", \"is_staff\": false, \"account_status\": \"active\", \"nickname\": \"bertimus9\", \"properties\": {}, \"account_id\": \"557058:c82eba35-00b1-4407-a4a8-56e99903b63a\"}, \"whats_new_feed\": \"https://bitbucket.org/blog/wp-json/wp/v2/posts?categories=196&context=embed&per_page=6&orderby=date&order=desc\"}, \"repository\": {\"source\": {\"section\": {\"hash\": \"0eeff89b0690611fc32e21f0cd2e4434abf8fe53\", \"atRef\": null, \"ref\": {\"name\": \"master\", \"links\": {\"self\": {\"href\": \"https://bitbucket.org/!api/2.0/repositories/bertimus9/systemstat/refs/branches/master\"}, \"html\": {\"href\": \"https://bitbucket.org/bertimus9/systemstat/branch/master\"}}, \"target\": {\"type\": \"commit\", \"hash\": \"0eeff89b0690611fc32e21f0cd2e4434abf8fe53\", \"links\": {\"self\": {\"href\": \"https://bitbucket.org/!api/2.0/repositories/bertimus9/systemstat/commit/0eeff89b0690611fc32e21f0cd2e4434abf8fe53\"}, \"html\": {\"href\": \"https://bitbucket.org/bertimus9/systemstat/commits/0eeff89b0690611fc32e21f0cd2e4434abf8fe53\"}}}}, \"showCloneGuidance\": false}}}};\n      window.__settings__ = {\"MARKETPLACE_TERMS_OF_USE_URL\": null, \"JIRA_ISSUE_COLLECTORS\": {\"code-review-beta\": {\"url\": \"https://bitbucketfeedback.atlassian.net/s/d41d8cd98f00b204e9800998ecf8427e-T/-4bqv2z/b/20/a44af77267a987a660377e5c46e0fb64/_/download/batch/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector.js?locale=en-US&collectorId=bb066400\", \"id\": \"bb066400\"}, \"jira-software-repo-page\": {\"url\": \"https://jira.atlassian.com/s/1ce410db1c7e1b043ed91ab8e28352e2-T/yl6d1c/804001/619f60e5de428c2ed7545f16096c303d/3.1.0/_/download/batch/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector.js?locale=en-UK&collectorId=064d6699\", \"id\": \"064d6699\"}, \"code-review-rollout\": {\"url\": \"https://bitbucketfeedback.atlassian.net/s/d41d8cd98f00b204e9800998ecf8427e-T/-4bqv2z/b/20/a44af77267a987a660377e5c46e0fb64/_/download/batch/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector.js?locale=en-US&collectorId=de003e2d\", \"id\": \"de003e2d\"}, \"source-browser\": {\"url\": \"https://bitbucketfeedback.atlassian.net/s/d41d8cd98f00b204e9800998ecf8427e-T/-tqnsjm/b/20/a44af77267a987a660377e5c46e0fb64/_/download/batch/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector.js?locale=en-US&collectorId=c19c2ff6\", \"id\": \"c19c2ff6\"}}, \"CANON_URL\": \"https://bitbucket.org\", \"AVAILABLE_SITES_URL\": \"https://api-private.atlassian.com/available-sites\", \"CONSENT_HUB_FRONTEND_BASE_URL\": \"https://preferences.atlassian.com\", \"API_CANON_URL\": \"https://api.bitbucket.org\", \"SOCIAL_AUTH_ATLASSIANID_LOGOUT_URL\": \"https://id.atlassian.com/logout\", \"EMOJI_STANDARD_BASE_URL\": \"https://api-private.atlassian.com/emoji/\"};\n      window.__webpack_nonce__ = 'pGz0PDmRcVGZXZn5';\n      window.isInitialLoadApdex = true;\n    </script>\n    \n      <script nonce=\"pGz0PDmRcVGZXZn5\">\n        window.__webpack_public_path__ = 'https://d301sr5gafysq2.cloudfront.net/frontbucket/';\n      </script>\n      <script nonce=\"pGz0PDmRcVGZXZn5\" src=\"https://d301sr5gafysq2.cloudfront.net/frontbucket/locales/en.e7cf3d2eb82b832b7675.js\"></script>\n        <script nonce=\"pGz0PDmRcVGZXZn5\" src=\"https://d301sr5gafysq2.cloudfront.net/frontbucket/runtime.7a5cad175e99010b63bd.js\"></script>\n        <script nonce=\"pGz0PDmRcVGZXZn5\" src=\"https://d301sr5gafysq2.cloudfront.net/frontbucket/vendor.b021be3be8ff328a7d4d.js\"></script>\n\n      <!-- NOTE: we need ajs to load before app.js otherwise connect may not work -->\n        <script nonce=\"pGz0PDmRcVGZXZn5\" src=\"https://d301sr5gafysq2.cloudfront.net/frontbucket/ajs.70681fa96febd19eab09.js\"></script>\n      <script nonce=\"pGz0PDmRcVGZXZn5\" src=\"https://d301sr5gafysq2.cloudfront.net/frontbucket/app.0753ae404d532af599fb.js\"></script>\n        <script nonce=\"pGz0PDmRcVGZXZn5\" defer src=\"https://d301sr5gafysq2.cloudfront.net/frontbucket/performance-timing.186ac7338f596554741f.js\"></script>\n    \n    <script nonce=\"pGz0PDmRcVGZXZn5\" type=\"text/javascript\">window.NREUM||(NREUM={});NREUM.info={\"beacon\":\"bam.nr-data.net\",\"queueTime\":0,\"licenseKey\":\"a2cef8c3d3\",\"agent\":\"\",\"transactionName\":\"NFcGYEdUW0IAVE1QCw0dIkFbVkFYDlkWWw0XUBFXXlBBHwBHSUpKEVcUWwcbQ1gEQEoDAgpeAVZHWkJCBA==\",\"applicationID\":\"1841284\",\"errorBeacon\":\"bam.nr-data.net\",\"applicationTime\":184}</script>\n  </body>\n</html>\n--------------------------------------------------------------------------------\nmodernc.org/cc  BSD 3-Clause \"New\" or \"Revised\" License  https://gitlab.com/cznic/cc/blob/master/LICENSE\n--------------------------------------------------------------------------------\n<!DOCTYPE html>\n<html class=\"\" lang=\"en\">\n<head prefix=\"og: http://ogp.me/ns#\">\n<meta charset=\"utf-8\">\n<link href=\"https://assets.gitlab-static.net\" rel=\"dns-prefetch\">\n<link crossorigin=\"\" href=\"https://assets.gitlab-static.net\" rel=\"preconnnect\">\n<meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\">\n<meta content=\"object\" property=\"og:type\">\n<meta content=\"GitLab\" property=\"og:site_name\">\n<meta content=\"LICENSE · master · cznic / cc\" property=\"og:title\">\n<meta content=\"Package CC is a C99 compiler front end.\" property=\"og:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"og:image\">\n<meta content=\"64\" property=\"og:image:width\">\n<meta content=\"64\" property=\"og:image:height\">\n<meta content=\"https://gitlab.com/cznic/cc/blob/master/LICENSE\" property=\"og:url\">\n<meta content=\"summary\" property=\"twitter:card\">\n<meta content=\"LICENSE · master · cznic / cc\" property=\"twitter:title\">\n<meta content=\"Package CC is a C99 compiler front end.\" property=\"twitter:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"twitter:image\">\n\n<title>LICENSE · master · cznic / cc · GitLab</title>\n<meta content=\"Package CC is a C99 compiler front end.\" name=\"description\">\n<link rel=\"shortcut icon\" type=\"image/png\" href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" id=\"favicon\" data-original-href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" />\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/application-a6e08192483b8e7eefdaa5a17246c14776ebd30ccf14cf9510edaed797b7fb2d.css\" />\n<link rel=\"stylesheet\" media=\"print\" href=\"https://assets.gitlab-static.net/assets/print-74c3df10dad473d66660c828e3aa54ca3bfeac6d8bb708643331403fe7211e60.css\" />\n\n\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/highlight/themes/white-3144068cf4f603d290f553b653926358ddcd02493b9728f62417682657fc58c0.css\" />\n<script nonce=\"0pVL4dt8aPTL+FdSprCbGA==\">\n//<![CDATA[\nwindow.gon={};\n//]]>\n</script>\n\n<script src=\"https://assets.gitlab-static.net/assets/webpack/runtime.e17b7ae7.bundle.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/main.75a7b9a1.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/sentry.281a8c95.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.admin.clusters~pages.admin.clusters.destroy~pages.admin.clusters.edit~pages.admin.clus~1ba693ac.ea1d3193.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.groups.epics.index~pages.groups.epics.show~pages.groups.milestones.edit~pages.groups.m~b7d7bc7f.bec192ac.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/pages.projects.blob.show.86ee57df.chunk.js\" defer=\"defer\"></script>\n\n<meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"U/ziCNhbxDygwCvW9kIFpbFwtEGnTtlN2Utq7xebHRn4DbEoTMvA+4x30eAmIJRPPbjx3tV8DM8YKVQrF7FpEQ==\" />\n<meta name=\"csp-nonce\" content=\"0pVL4dt8aPTL+FdSprCbGA==\" />\n<meta content=\"origin-when-cross-origin\" name=\"referrer\">\n<meta content=\"width=device-width, initial-scale=1, maximum-scale=1\" name=\"viewport\">\n<meta content=\"#474D57\" name=\"theme-color\">\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-5a9cee0e8a51212e70b90c87c12f382c428870c0ff67d1eb034d884b78d2dae7.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-a6eec6aeb9da138e507593b464fdac213047e49d3093fc30e90d9a995df83ba3.png\" sizes=\"76x76\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-retina-72e2aadf86513a56e050e7f0f2355deaa19cc17ed97bbe5147847f2748e5a3e3.png\" sizes=\"120x120\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png\" sizes=\"152x152\" />\n<link color=\"rgb(226, 67, 41)\" href=\"https://assets.gitlab-static.net/assets/logo-d36b5212042cebc89b96df4bf6ac24e43db316143e89926c0db839ff694d2de4.svg\" rel=\"mask-icon\">\n<meta content=\"https://assets.gitlab-static.net/assets/msapplication-tile-1196ec67452f618d39cdd85e2e3a542f76574c071051ae7effbfde01710eb17d.png\" name=\"msapplication-TileImage\">\n<meta content=\"#30353E\" name=\"msapplication-TileColor\">\n\n\n\n<script nonce=\"0pVL4dt8aPTL+FdSprCbGA==\">\n//<![CDATA[\n;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[];\np.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)\n};p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;\nn.src=w;g.parentNode.insertBefore(n,g)}}(window,document,\"script\",\"https://assets.gitlab-static.net/assets/snowplow/sp-e10fd598642f1a4dd3e9e0e026f6a1ffa3c31b8a40efd92db3f92d32873baed6.js\",\"snowplow\"));\n\nwindow.snowplowOptions = {\"namespace\":\"gl\",\"hostname\":\"snowplow.trx.gitlab.net\",\"cookieDomain\":\".gitlab.com\",\"appId\":\"gitlab\",\"formTracking\":true,\"linkClickTracking\":true,\"igluRegistryUrl\":null}\n\n\n//]]>\n</script>\n</head>\n\n<body class=\"ui-indigo  gl-browser-generic gl-platform-other\" data-find-file=\"/cznic/cc/find_file/master\" data-group=\"\" data-namespace-id=\"3055233\" data-page=\"projects:blob:show\" data-page-type-id=\"master/LICENSE\" data-project=\"cc\" data-project-id=\"9240892\">\n\n<script nonce=\"0pVL4dt8aPTL+FdSprCbGA==\">\n//<![CDATA[\ngl = window.gl || {};\ngl.client = {\"isGeneric\":true,\"isOther\":true};\n\n\n//]]>\n</script>\n\n\n<header class=\"navbar navbar-gitlab navbar-expand-sm js-navbar\" data-qa-selector=\"navbar\">\n<a class=\"sr-only gl-accessibility\" href=\"#content-body\" tabindex=\"1\">Skip to content</a>\n<div class=\"container-fluid\">\n<div class=\"header-content\">\n<div class=\"title-container\">\n<h1 class=\"title\">\n<a title=\"Dashboard\" id=\"logo\" href=\"/\"><svg width=\"24\" height=\"24\" class=\"tanuki-logo\" viewBox=\"0 0 36 36\">\n  <path class=\"tanuki-shape tanuki-left-ear\" fill=\"#e24329\" d=\"M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-right-ear\" fill=\"#e24329\" d=\"M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-nose\" fill=\"#e24329\" d=\"M18,34.38 3,14 33,14 Z\"/>\n  <path class=\"tanuki-shape tanuki-left-eye\" fill=\"#fc6d26\" d=\"M18,34.38 11.38,14 2,14 6,25Z\"/>\n  <path class=\"tanuki-shape tanuki-right-eye\" fill=\"#fc6d26\" d=\"M18,34.38 24.62,14 34,14 30,25Z\"/>\n  <path class=\"tanuki-shape tanuki-left-cheek\" fill=\"#fca326\" d=\"M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z\"/>\n  <path class=\"tanuki-shape tanuki-right-cheek\" fill=\"#fca326\" d=\"M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z\"/>\n</svg>\n\n<span class=\"logo-text d-none d-lg-block prepend-left-8\">\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 617 169\"><path d=\"M315.26 2.97h-21.8l.1 162.5h88.3v-20.1h-66.5l-.1-142.4M465.89 136.95c-5.5 5.7-14.6 11.4-27 11.4-16.6 0-23.3-8.2-23.3-18.9 0-16.1 11.2-23.8 35-23.8 4.5 0 11.7.5 15.4 1.2v30.1h-.1m-22.6-98.5c-17.6 0-33.8 6.2-46.4 16.7l7.7 13.4c8.9-5.2 19.8-10.4 35.5-10.4 17.9 0 25.8 9.2 25.8 24.6v7.9c-3.5-.7-10.7-1.2-15.1-1.2-38.2 0-57.6 13.4-57.6 41.4 0 25.1 15.4 37.7 38.7 37.7 15.7 0 30.8-7.2 36-18.9l4 15.9h15.4v-83.2c-.1-26.3-11.5-43.9-44-43.9M557.63 149.1c-8.2 0-15.4-1-20.8-3.5V70.5c7.4-6.2 16.6-10.7 28.3-10.7 21.1 0 29.2 14.9 29.2 39 0 34.2-13.1 50.3-36.7 50.3m9.2-110.6c-19.5 0-30 13.3-30 13.3v-21l-.1-27.8h-21.3l.1 158.5c10.7 4.5 25.3 6.9 41.2 6.9 40.7 0 60.3-26 60.3-70.9-.1-35.5-18.2-59-50.2-59M77.9 20.6c19.3 0 31.8 6.4 39.9 12.9l9.4-16.3C114.5 6 97.3 0 78.9 0 32.5 0 0 28.3 0 85.4c0 59.8 35.1 83.1 75.2 83.1 20.1 0 37.2-4.7 48.4-9.4l-.5-63.9V75.1H63.6v20.1h38l.5 48.5c-5 2.5-13.6 4.5-25.3 4.5-32.2 0-53.8-20.3-53.8-63-.1-43.5 22.2-64.6 54.9-64.6M231.43 2.95h-21.3l.1 27.3v94.3c0 26.3 11.4 43.9 43.9 43.9 4.5 0 8.9-.4 13.1-1.2v-19.1c-3.1.5-6.4.7-9.9.7-17.9 0-25.8-9.2-25.8-24.6v-65h35.7v-17.8h-35.7l-.1-38.5M155.96 165.47h21.3v-124h-21.3v124M155.96 24.37h21.3V3.07h-21.3v21.3\"/></svg>\n\n</span>\n</a></h1>\n<ul class=\"list-unstyled navbar-sub-nav\">\n<li class=\"home\"><a title=\"Projects\" class=\"dashboard-shortcuts-projects\" href=\"/explore\">Projects\n</a></li><li class=\"\"><a title=\"Groups\" class=\"dashboard-shortcuts-groups\" href=\"/explore/groups\">Groups\n</a></li><li class=\"\"><a title=\"Snippets\" class=\"dashboard-shortcuts-snippets\" href=\"/explore/snippets\">Snippets\n</a></li><li>\n<a title=\"About GitLab CE\" href=\"/help\">Help</a>\n</li>\n</ul>\n\n</div>\n<div class=\"navbar-collapse collapse\">\n<ul class=\"nav navbar-nav\">\n<li class=\"nav-item d-none d-lg-block m-auto\">\n<div class=\"search search-form\" data-track-event=\"activate_form_input\" data-track-label=\"navbar_search\" data-track-value=\"\">\n<form class=\"form-inline\" action=\"/search\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><div class=\"search-input-container\">\n<div class=\"search-input-wrap\">\n<div class=\"dropdown\" data-url=\"/search/autocomplete\">\n<input type=\"search\" name=\"search\" id=\"search\" placeholder=\"Search or jump to…\" class=\"search-input dropdown-menu-toggle no-outline js-search-dashboard-options\" spellcheck=\"false\" tabindex=\"1\" autocomplete=\"off\" data-issues-path=\"/dashboard/issues\" data-mr-path=\"/dashboard/merge_requests\" data-qa-selector=\"search_term_field\" aria-label=\"Search or jump to…\" />\n<button class=\"hidden js-dropdown-search-toggle\" data-toggle=\"dropdown\" type=\"button\"></button>\n<div class=\"dropdown-menu dropdown-select js-dashboard-search-options\">\n<div class=\"dropdown-content\"><ul>\n<li class=\"dropdown-menu-empty-item\">\n<a>\nLoading...\n</a>\n</li>\n</ul>\n</div><div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n<svg class=\"s16 search-icon\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n<svg class=\"s16 clear-icon js-clear-input\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</div>\n</div>\n</div>\n<input type=\"hidden\" name=\"group_id\" id=\"group_id\" class=\"js-search-group-options\" />\n<input type=\"hidden\" name=\"project_id\" id=\"search_project_id\" value=\"9240892\" class=\"js-search-project-options\" data-project-path=\"cc\" data-name=\"cc\" data-issues-path=\"/cznic/cc/issues\" data-mr-path=\"/cznic/cc/merge_requests\" data-issues-disabled=\"false\" />\n<input type=\"hidden\" name=\"search_code\" id=\"search_code\" value=\"true\" />\n<input type=\"hidden\" name=\"repository_ref\" id=\"repository_ref\" value=\"master\" />\n<input type=\"hidden\" name=\"nav_source\" id=\"nav_source\" value=\"navbar\" />\n<div class=\"search-autocomplete-opts hide\" data-autocomplete-path=\"/search/autocomplete\" data-autocomplete-project-id=\"9240892\" data-autocomplete-project-ref=\"master\"></div>\n</form></div>\n\n</li>\n<li class=\"nav-item d-inline-block d-lg-none\">\n<a title=\"Search\" aria-label=\"Search\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" href=\"/search?project_id=9240892\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n</a></li>\n<li class=\"nav-item header-help dropdown d-none d-md-block\">\n<a class=\"header-help-dropdown-toggle\" data-toggle=\"dropdown\" href=\"/help\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#question\"></use></svg>\n<svg class=\"caret-down\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-down\"></use></svg>\n</a><div class=\"dropdown-menu dropdown-menu-right\">\n<ul>\n<li>\n<a href=\"/help\">Help</a>\n</li>\n<li>\n<a href=\"https://about.gitlab.com/getting-help/\">Support</a>\n</li>\n\n<li class=\"divider\"></li>\n<li>\n<a href=\"https://about.gitlab.com/submit-feedback\">Submit feedback</a>\n</li>\n<li>\n<a target=\"_blank\" class=\"text-nowrap\" href=\"https://about.gitlab.com/contributing\">Contribute to GitLab\n</a>\n\n</li>\n\n<li>\n<a href=\"https://next.gitlab.com/\">Switch to GitLab Next</a>\n</li>\n</ul>\n\n</div>\n</li>\n<li class=\"nav-item\">\n<div>\n<a class=\"btn btn-sign-in\" href=\"/users/sign_in?redirect_to_referer=yes\">Sign in / Register</a>\n</div>\n</li>\n</ul>\n</div>\n<button class=\"navbar-toggler d-block d-sm-none\" type=\"button\">\n<span class=\"sr-only\">Toggle navigation</span>\n<svg class=\"s12 more-icon js-navbar-toggle-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#ellipsis_h\"></use></svg>\n<svg class=\"s12 close-icon js-navbar-toggle-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</button>\n</div>\n</div>\n</header>\n\n<div class=\"layout-page page-with-contextual-sidebar\">\n<div class=\"nav-sidebar\">\n<div class=\"nav-sidebar-inner-scroll\">\n<div class=\"context-header\">\n<a title=\"cc\" href=\"/cznic/cc\"><div class=\"avatar-container rect-avatar s40 project-avatar\">\n<div class=\"avatar s40 avatar-tile identicon bg4\">C</div>\n</div>\n<div class=\"sidebar-context-title\">\ncc\n</div>\n</a></div>\n<ul class=\"sidebar-top-level-items\">\n<li class=\"home\"><a class=\"shortcuts-project rspec-project-link\" data-qa-selector=\"project_link\" href=\"/cznic/cc\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#home\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nProject overview\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc\"><strong class=\"fly-out-top-item-name\">\nProject overview\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Project details\" class=\"shortcuts-project\" href=\"/cznic/cc\"><span>Details</span>\n</a></li><li class=\"\"><a title=\"Activity\" class=\"shortcuts-project-activity\" data-qa-selector=\"activity_link\" href=\"/cznic/cc/activity\"><span>Activity</span>\n</a></li><li class=\"\"><a title=\"Releases\" class=\"shortcuts-project-releases\" href=\"/cznic/cc/-/releases\"><span>Releases</span>\n</a></li><li class=\"\"><a title=\"Cycle Analytics\" class=\"shortcuts-project-cycle-analytics\" href=\"/cznic/cc/-/cycle_analytics\"><span>Cycle Analytics</span>\n</a></li><li class=\"\"><a title=\"Insights\" class=\"shortcuts-project-insights\" data-qa-selector=\"project_insights_link\" href=\"/cznic/cc/insights/\"><span>Insights</span>\n</a></li>\n</ul>\n</li><li class=\"active\"><a class=\"shortcuts-tree qa-project-menu-repo\" href=\"/cznic/cc/tree/master\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-text\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-repo-link\">\nRepository\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item active\"><a href=\"/cznic/cc/tree/master\"><strong class=\"fly-out-top-item-name\">\nRepository\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"active\"><a href=\"/cznic/cc/tree/master\">Files\n</a></li><li class=\"\"><a id=\"js-onboarding-commits-link\" href=\"/cznic/cc/commits/master\">Commits\n</a></li><li class=\"\"><a class=\"qa-branches-link\" id=\"js-onboarding-branches-link\" href=\"/cznic/cc/-/branches\">Branches\n</a></li><li class=\"\"><a href=\"/cznic/cc/-/tags\">Tags\n</a></li><li class=\"\"><a href=\"/cznic/cc/-/graphs/master\">Contributors\n</a></li><li class=\"\"><a href=\"/cznic/cc/-/network/master\">Graph\n</a></li><li class=\"\"><a href=\"/cznic/cc/compare?from=master&amp;to=master\">Compare\n</a></li><li class=\"\"><a href=\"/cznic/cc/-/graphs/master/charts\">Charts\n</a></li><li class=\"\"><a data-qa-selector=\"path_locks_link\" href=\"/cznic/cc/path_locks\">Locked Files\n</a></li>\n</ul>\n</li><li class=\"\"><a class=\"shortcuts-issues qa-issues-item\" href=\"/cznic/cc/issues\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#issues\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-issues-link\">\nIssues\n</span>\n<span class=\"badge badge-pill count issue_counter\">\n2\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/issues\"><strong class=\"fly-out-top-item-name\">\nIssues\n</strong>\n<span class=\"badge badge-pill count issue_counter fly-out-badge\">\n2\n</span>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Issues\" href=\"/cznic/cc/issues\"><span>\nList\n</span>\n</a></li><li class=\"\"><a title=\"Boards\" data-qa-selector=\"issue_boards_link\" href=\"/cznic/cc/-/boards\"><span>\nBoards\n</span>\n</a></li><li class=\"\"><a title=\"Labels\" class=\"qa-labels-link\" href=\"/cznic/cc/-/labels\"><span>\nLabels\n</span>\n</a></li><li class=\"\"><a title=\"Service Desk\" href=\"/cznic/cc/issues/service_desk\">Service Desk\n</a></li>\n<li class=\"\"><a title=\"Milestones\" class=\"qa-milestones-link\" href=\"/cznic/cc/-/milestones\"><span>\nMilestones\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-merge_requests\" data-qa-selector=\"merge_requests_link\" href=\"/cznic/cc/merge_requests\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#git-merge\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-mr-link\">\nMerge Requests\n</span>\n<span class=\"badge badge-pill count merge_counter js-merge-counter\">\n1\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/merge_requests\"><strong class=\"fly-out-top-item-name\">\nMerge Requests\n</strong>\n<span class=\"badge badge-pill count merge_counter js-merge-counter fly-out-badge\">\n1\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-pipelines qa-link-pipelines rspec-link-pipelines\" data-qa-selector=\"ci_cd_link\" href=\"/cznic/cc/pipelines\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#rocket\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-pipelines-link\">\nCI / CD\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/pipelines\"><strong class=\"fly-out-top-item-name\">\nCI / CD\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Pipelines\" class=\"shortcuts-pipelines\" href=\"/cznic/cc/pipelines\"><span>\nPipelines\n</span>\n</a></li><li class=\"\"><a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/cc/-/jobs\"><span>\nJobs\n</span>\n</a></li><li class=\"\"><a title=\"Schedules\" class=\"shortcuts-builds\" href=\"/cznic/cc/pipeline_schedules\"><span>\nSchedules\n</span>\n</a></li><li class=\"\"><a title=\"Charts\" class=\"shortcuts-pipelines-charts\" href=\"/cznic/cc/pipelines/charts\"><span>\nCharts\n</span>\n</a></li></ul>\n</li><li class=\"\"><a data-qa-selector=\"dependency_list_link\" href=\"/cznic/cc/dependencies\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#shield\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSecurity &amp; Compliance\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/dependencies\"><strong class=\"fly-out-top-item-name\">\nSecurity &amp; Compliance\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Dependency List\" data-qa-selector=\"dependency_list_link\" href=\"/cznic/cc/dependencies\"><span>Dependency List</span>\n</a></li><li class=\"\"><a title=\"License Compliance\" data-qa-selector=\"licenses_list_link\" href=\"/cznic/cc/-/licenses\"><span>License Compliance</span>\n</a></li></ul>\n</li>\n<li class=\"\"><a data-qa-selector=\"packages_link\" href=\"/cznic/cc/-/packages\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#package\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nPackages\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/-/packages\"><strong class=\"fly-out-top-item-name\">\nPackages\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Packages\" href=\"/cznic/cc/-/packages\"><span>List</span>\n</a></li><li class=\"\"><a class=\"shortcuts-container-registry\" title=\"Container Registry\" href=\"/cznic/cc/container_registry\"><span>Container Registry</span>\n</a></li></ul>\n</li>\n\n<li class=\"\"><a class=\"shortcuts-wiki\" data-qa-selector=\"wiki_link\" href=\"/cznic/cc/-/wikis/home\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#book\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nWiki\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/-/wikis/home\"><strong class=\"fly-out-top-item-name\">\nWiki\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-snippets\" href=\"/cznic/cc/snippets\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#snippet\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSnippets\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/snippets\"><strong class=\"fly-out-top-item-name\">\nSnippets\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a title=\"Members\" class=\"shortcuts-tree\" href=\"/cznic/cc/-/settings/members\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#users\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nMembers\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/cc/-/project_members\"><strong class=\"fly-out-top-item-name\">\nMembers\n</strong>\n</a></li></ul>\n</li><a class=\"toggle-sidebar-button js-toggle-sidebar qa-toggle-sidebar rspec-toggle-sidebar\" role=\"button\" title=\"Toggle sidebar\" type=\"button\">\n<svg class=\"icon-angle-double-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-left\"></use></svg>\n<svg class=\"icon-angle-double-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-right\"></use></svg>\n<span class=\"collapse-text\">Collapse sidebar</span>\n</a>\n<button name=\"button\" type=\"button\" class=\"close-nav-button\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n<span class=\"collapse-text\">Close sidebar</span>\n</button>\n<li class=\"hidden\">\n<a title=\"Activity\" class=\"shortcuts-project-activity\" href=\"/cznic/cc/activity\"><span>\nActivity\n</span>\n</a></li>\n<li class=\"hidden\">\n<a title=\"Network\" class=\"shortcuts-network\" href=\"/cznic/cc/-/network/master\">Graph\n</a></li>\n<li class=\"hidden\">\n<a title=\"Charts\" class=\"shortcuts-repository-charts\" href=\"/cznic/cc/-/graphs/master/charts\">Charts\n</a></li>\n<li class=\"hidden\">\n<a class=\"shortcuts-new-issue\" href=\"/cznic/cc/issues/new\">Create a new issue\n</a></li>\n<li class=\"hidden\">\n<a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/cc/-/jobs\">Jobs\n</a></li>\n<li class=\"hidden\">\n<a title=\"Commits\" class=\"shortcuts-commits\" href=\"/cznic/cc/commits/master\">Commits\n</a></li>\n<li class=\"hidden\">\n<a title=\"Issue Boards\" class=\"shortcuts-issue-boards\" href=\"/cznic/cc/-/boards\">Issue Boards</a>\n</li>\n</ul>\n</div>\n</div>\n\n<div class=\"content-wrapper\">\n\n<div class=\"mobile-overlay\"></div>\n<div class=\"alert-wrapper\">\n\n\n\n\n\n\n<nav class=\"breadcrumbs container-fluid container-limited\" role=\"navigation\">\n<div class=\"breadcrumbs-container\">\n<button name=\"button\" type=\"button\" class=\"toggle-mobile-nav\"><span class=\"sr-only\">Open sidebar</span>\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-bars\"></i>\n</button><div class=\"breadcrumbs-links js-title-container\">\n<ul class=\"list-unstyled breadcrumbs-list js-breadcrumbs-list\">\n<li><a href=\"/cznic\">cznic</a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li> <li><a href=\"/cznic/cc\"><span class=\"breadcrumb-item-text js-breadcrumb-item-text\">cc</span></a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li>\n\n<li>\n<h2 class=\"breadcrumbs-sub-title\"><a href=\"/cznic/cc/blob/master/LICENSE\">Repository</a></h2>\n</li>\n</ul>\n</div>\n\n</div>\n</nav>\n\n<div class=\"d-flex\"></div>\n</div>\n<div class=\"container-fluid container-limited \">\n<div class=\"content\" id=\"content-body\">\n<div class=\"flash-container flash-container-page sticky\">\n</div>\n\n<div class=\"js-signature-container\" data-signatures-path=\"/cznic/cc/commits/3571a29f99569689633494ac65dc685800994b57/signatures?limit=1\"></div>\n\n<div class=\"tree-holder\" id=\"tree-holder\">\n<div class=\"nav-block\">\n<div class=\"tree-ref-container\">\n<div class=\"tree-ref-holder\">\n<form class=\"project-refs-form\" action=\"/cznic/cc/refs/switch\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"destination\" id=\"destination\" value=\"blob\" />\n<input type=\"hidden\" name=\"path\" id=\"path\" value=\"LICENSE\" />\n<div class=\"dropdown\">\n<button class=\"dropdown-menu-toggle js-project-refs-dropdown qa-branches-select\" type=\"button\" data-toggle=\"dropdown\" data-selected=\"master\" data-ref=\"master\" data-refs-url=\"/cznic/cc/refs?sort=updated_desc\" data-field-name=\"ref\" data-submit-form-on-click=\"true\" data-visit=\"true\"><span class=\"dropdown-toggle-text \">master</span><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-chevron-down\"></i></button>\n<div class=\"dropdown-menu dropdown-menu-paging dropdown-menu-selectable git-revision-dropdown qa-branches-dropdown\">\n<div class=\"dropdown-page-one\">\n<div class=\"dropdown-title\"><span>Switch branch/tag</span><button class=\"dropdown-title-button dropdown-menu-close\" aria-label=\"Close\" type=\"button\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-times dropdown-menu-close-icon\"></i></button></div>\n<div class=\"dropdown-input\"><input type=\"search\" id=\"\" class=\"dropdown-input-field qa-dropdown-input-field\" placeholder=\"Search branches and tags\" autocomplete=\"off\" /><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search dropdown-input-search\"></i><i aria-hidden=\"true\" data-hidden=\"true\" role=\"button\" class=\"fa fa-times dropdown-input-clear js-dropdown-input-clear\"></i></div>\n<div class=\"dropdown-content\"></div>\n<div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n</div>\n</div>\n</form>\n</div>\n<ul class=\"breadcrumb repo-breadcrumb\">\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/cc/tree/master\">cc\n</a></li>\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/cc/blob/master/LICENSE\"><strong>LICENSE</strong>\n</a></li>\n</ul>\n</div>\n<div class=\"tree-controls\"><a class=\"btn shortcuts-find-file\" rel=\"nofollow\" href=\"/cznic/cc/find_file/master\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search\"></i>\n<span>Find file</span>\n</a><a class=\"btn js-blob-blame-link\" href=\"/cznic/cc/blame/master/LICENSE\">Blame</a><a class=\"btn\" href=\"/cznic/cc/commits/master/LICENSE\">History</a><a class=\"btn js-data-file-blob-permalink-url\" href=\"/cznic/cc/blob/01bdf7e9a7d12f393265eab16ec3dc4f209db6f7/LICENSE\">Permalink</a></div>\n</div>\n\n<div class=\"info-well d-none d-sm-block\">\n<div class=\"well-segment\">\n<ul class=\"blob-commit-info\">\n<li class=\"commit flex-row js-toggle-container\" id=\"commit-3571a29f\">\n<div class=\"avatar-cell d-none d-sm-block\">\n<a href=\"/cznic\"><img alt=\"cznic&#39;s avatar\" src=\"/uploads/-/system/user/avatar/2447325/avatar.png?width=40\" class=\"avatar s40 d-none d-sm-inline-block\" title=\"cznic\" /></a>\n</div>\n<div class=\"commit-detail flex-list\">\n<div class=\"commit-content qa-commit-content\">\n<a class=\"commit-row-message item-title js-onboarding-commit-item\" href=\"/cznic/cc/commit/3571a29f99569689633494ac65dc685800994b57\">Add initial content.</a>\n<span class=\"commit-row-message d-inline d-sm-none\">\n&middot;\n3571a29f\n</span>\n<div class=\"committer\">\n<a class=\"commit-author-link js-user-link\" data-user-id=\"2447325\" href=\"/cznic\">cznic</a> authored <time class=\"js-timeago\" title=\"Mar 3, 2016 11:10am\" datetime=\"2016-03-03T11:10:49Z\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\">Mar 03, 2016</time>\n</div>\n\n</div>\n<div class=\"commit-actions flex-row\">\n\n<div class=\"js-commit-pipeline-status\" data-endpoint=\"/cznic/cc/commit/3571a29f99569689633494ac65dc685800994b57/pipelines?ref=master\"></div>\n<div class=\"commit-sha-group d-none d-sm-flex\">\n<div class=\"label label-monospace monospace\">\n3571a29f\n</div>\n<button class=\"btn btn btn-default\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-title=\"Copy commit SHA\" data-class=\"btn btn-default\" data-clipboard-text=\"3571a29f99569689633494ac65dc685800994b57\" type=\"button\" title=\"Copy commit SHA\" aria-label=\"Copy commit SHA\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n\n</div>\n</div>\n</div>\n</li>\n\n</ul>\n</div>\n\n<div class=\"well-segment blob-auxiliary-viewer\">\n<div class=\"blob-viewer\" data-type=\"auxiliary\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-balance-scale fa-fw\"></i>\nThis project is licensed under the\n<strong>BSD 3-clause &quot;New&quot; or &quot;Revised&quot; License</strong>.\n<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://choosealicense.com/licenses/bsd-3-clause/\">Learn more</a>\n\n</div>\n\n</div>\n\n</div>\n<div class=\"blob-content-holder\" id=\"blob-content-holder\">\n<article class=\"file-holder\">\n<div class=\"js-file-title file-title-flex-parent\">\n<div class=\"file-header-content\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-file-text-o fa-fw\"></i>\n<strong class=\"file-title-name qa-file-title-name\">\nLICENSE\n</strong>\n<button class=\"btn btn-clipboard btn-transparent\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn-clipboard btn-transparent\" data-title=\"Copy file path\" data-clipboard-text=\"{&quot;text&quot;:&quot;LICENSE&quot;,&quot;gfm&quot;:&quot;`LICENSE`&quot;}\" type=\"button\" title=\"Copy file path\" aria-label=\"Copy file path\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n<small class=\"mr-1\">\n1.45 KB\n</small>\n</div>\n\n<div class=\"file-actions\">\n\n<div class=\"btn-group\" role=\"group\"><a class=\"btn btn-primary js-edit-blob  btn-sm\" href=\"/cznic/cc/edit/master/LICENSE\">Edit</a><a class=\"btn btn-inverted btn-primary ide-edit-button btn-sm\" href=\"/-/ide/project/cznic/cc/edit/master/-/LICENSE\">Web IDE</a></div>\n<div class=\"btn-group\" role=\"group\">\n</div>\n<div class=\"btn-group\" role=\"group\"><button class=\"btn btn btn-sm js-copy-blob-source-btn\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn btn-sm js-copy-blob-source-btn\" data-title=\"Copy file contents\" data-clipboard-target=\".blob-content[data-blob-id=&#39;81fdfc37fa0ac0b10d219a0696547206a4c23fbd&#39;]\" type=\"button\" title=\"Copy file contents\" aria-label=\"Copy file contents\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button><a class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open raw\" title=\"Open raw\" data-container=\"body\" href=\"/cznic/cc/raw/master/LICENSE\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-code\"></use></svg></a><a download=\"LICENSE\" class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Download\" title=\"Download\" data-container=\"body\" href=\"/cznic/cc/raw/master/LICENSE?inline=false\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#download\"></use></svg></a></div>\n</div>\n</div>\n\n<script id=\"js-file-lock\" type=\"application/json\">\n{\"path\":\"LICENSE\",\"toggle_path\":\"/cznic/cc/path_locks/toggle\"}\n</script>\n\n\n<div class=\"blob-viewer\" data-type=\"simple\" data-url=\"/cznic/cc/blob/master/LICENSE?format=json&amp;viewer=simple\">\n<div class=\"text-center prepend-top-default append-bottom-default\">\n<i aria-hidden=\"true\" aria-label=\"Loading content…\" class=\"fa fa-spinner fa-spin fa-2x qa-spinner\"></i>\n</div>\n\n</div>\n\n\n</article>\n</div>\n\n<div class=\"modal\" id=\"modal-upload-blob\">\n<div class=\"modal-dialog modal-lg\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3 class=\"page-title\">Replace LICENSE</h3>\n<button aria-label=\"Close\" class=\"close\" data-dismiss=\"modal\" type=\"button\">\n<span aria-hidden>&times;</span>\n</button>\n</div>\n<div class=\"modal-body\">\n<form class=\"js-quick-submit js-upload-blob-form\" data-method=\"put\" action=\"/cznic/cc/update/master/LICENSE\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"_method\" value=\"put\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"P/h1cU2nlrznCTY78F6K9ROKEU10UP24sM2cDaGvDFKUCSZR2TeSe8u+zA0gPBsfn0JU0gZiKDpxr6LJoYV4Wg==\" /><div class=\"dropzone\">\n<div class=\"dropzone-previews blob-upload-dropzone-previews\">\n<p class=\"dz-message light\">\nAttach a file by drag &amp; drop or <a class=\"markdown-selector\" href=\"#\">click to upload</a>\n</p>\n</div>\n</div>\n<br>\n<div class=\"dropzone-alerts alert alert-danger data\" style=\"display:none\"></div>\n<div class=\"form-group row commit_message-group\">\n<label class=\"col-form-label col-sm-2\" for=\"commit_message-3b76de8012eb17a2c3031d64e62fe884\">Commit message\n</label><div class=\"col-sm-10\">\n<div class=\"commit-message-container\">\n<div class=\"max-width-marker\"></div>\n<textarea name=\"commit_message\" id=\"commit_message-3b76de8012eb17a2c3031d64e62fe884\" class=\"form-control js-commit-message\" placeholder=\"Replace LICENSE\" required=\"required\" rows=\"3\">\nReplace LICENSE</textarea>\n</div>\n</div>\n</div>\n\n<input type=\"hidden\" name=\"branch_name\" id=\"branch_name\" />\n<input type=\"hidden\" name=\"create_merge_request\" id=\"create_merge_request\" value=\"1\" />\n<input type=\"hidden\" name=\"original_branch\" id=\"original_branch\" value=\"master\" class=\"js-original-branch\" />\n\n<div class=\"form-actions\">\n<button name=\"button\" type=\"button\" class=\"btn btn-success btn-upload-file\" id=\"submit-all\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spin fa-spinner js-loading-icon hidden\"></i>\nReplace file\n</button><a class=\"btn btn-cancel\" data-dismiss=\"modal\" href=\"#\">Cancel</a>\n<div class=\"inline prepend-left-10\">\nA new branch will be created in your fork and a new merge request will be started.\n</div>\n\n</div>\n</form></div>\n</div>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n</div>\n</div>\n\n\n\n\n</body>\n</html>\n\n\n--------------------------------------------------------------------------------\nmodernc.org/golex  BSD 3-Clause \"New\" or \"Revised\" License  https://gitlab.com/cznic/golex/blob/master/LICENSE\n--------------------------------------------------------------------------------\n<!DOCTYPE html>\n<html class=\"\" lang=\"en\">\n<head prefix=\"og: http://ogp.me/ns#\">\n<meta charset=\"utf-8\">\n<link href=\"https://assets.gitlab-static.net\" rel=\"dns-prefetch\">\n<link crossorigin=\"\" href=\"https://assets.gitlab-static.net\" rel=\"preconnnect\">\n<meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\">\n<meta content=\"object\" property=\"og:type\">\n<meta content=\"GitLab\" property=\"og:site_name\">\n<meta content=\"LICENSE · master · cznic / golex\" property=\"og:title\">\n<meta content=\"A lex/flex like (not fully POSIX lex compatible) utility.\" property=\"og:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"og:image\">\n<meta content=\"64\" property=\"og:image:width\">\n<meta content=\"64\" property=\"og:image:height\">\n<meta content=\"https://gitlab.com/cznic/golex/blob/master/LICENSE\" property=\"og:url\">\n<meta content=\"summary\" property=\"twitter:card\">\n<meta content=\"LICENSE · master · cznic / golex\" property=\"twitter:title\">\n<meta content=\"A lex/flex like (not fully POSIX lex compatible) utility.\" property=\"twitter:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"twitter:image\">\n\n<title>LICENSE · master · cznic / golex · GitLab</title>\n<meta content=\"A lex/flex like (not fully POSIX lex compatible) utility.\" name=\"description\">\n<link rel=\"shortcut icon\" type=\"image/png\" href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" id=\"favicon\" data-original-href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" />\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/application-a6e08192483b8e7eefdaa5a17246c14776ebd30ccf14cf9510edaed797b7fb2d.css\" />\n<link rel=\"stylesheet\" media=\"print\" href=\"https://assets.gitlab-static.net/assets/print-74c3df10dad473d66660c828e3aa54ca3bfeac6d8bb708643331403fe7211e60.css\" />\n\n\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/highlight/themes/white-3144068cf4f603d290f553b653926358ddcd02493b9728f62417682657fc58c0.css\" />\n<script nonce=\"0r3eHqYx4WOTsAC6G3fH1Q==\">\n//<![CDATA[\nwindow.gon={};\n//]]>\n</script>\n\n<script src=\"https://assets.gitlab-static.net/assets/webpack/runtime.e17b7ae7.bundle.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/main.75a7b9a1.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/sentry.281a8c95.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.admin.clusters~pages.admin.clusters.destroy~pages.admin.clusters.edit~pages.admin.clus~1ba693ac.ea1d3193.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.groups.epics.index~pages.groups.epics.show~pages.groups.milestones.edit~pages.groups.m~b7d7bc7f.bec192ac.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/pages.projects.blob.show.86ee57df.chunk.js\" defer=\"defer\"></script>\n\n<meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"nZRqYMtXPXFzJe+vQcsNkVrAqyHhzhpmDZxp/6rz+FkkMM0g3F4Jaawiw1oxmrAk8dmhDD1jIKSmRVAEPje5Zw==\" />\n<meta name=\"csp-nonce\" content=\"0r3eHqYx4WOTsAC6G3fH1Q==\" />\n<meta content=\"origin-when-cross-origin\" name=\"referrer\">\n<meta content=\"width=device-width, initial-scale=1, maximum-scale=1\" name=\"viewport\">\n<meta content=\"#474D57\" name=\"theme-color\">\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-5a9cee0e8a51212e70b90c87c12f382c428870c0ff67d1eb034d884b78d2dae7.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-a6eec6aeb9da138e507593b464fdac213047e49d3093fc30e90d9a995df83ba3.png\" sizes=\"76x76\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-retina-72e2aadf86513a56e050e7f0f2355deaa19cc17ed97bbe5147847f2748e5a3e3.png\" sizes=\"120x120\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png\" sizes=\"152x152\" />\n<link color=\"rgb(226, 67, 41)\" href=\"https://assets.gitlab-static.net/assets/logo-d36b5212042cebc89b96df4bf6ac24e43db316143e89926c0db839ff694d2de4.svg\" rel=\"mask-icon\">\n<meta content=\"https://assets.gitlab-static.net/assets/msapplication-tile-1196ec67452f618d39cdd85e2e3a542f76574c071051ae7effbfde01710eb17d.png\" name=\"msapplication-TileImage\">\n<meta content=\"#30353E\" name=\"msapplication-TileColor\">\n\n\n\n<script nonce=\"0r3eHqYx4WOTsAC6G3fH1Q==\">\n//<![CDATA[\n;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[];\np.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)\n};p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;\nn.src=w;g.parentNode.insertBefore(n,g)}}(window,document,\"script\",\"https://assets.gitlab-static.net/assets/snowplow/sp-e10fd598642f1a4dd3e9e0e026f6a1ffa3c31b8a40efd92db3f92d32873baed6.js\",\"snowplow\"));\n\nwindow.snowplowOptions = {\"namespace\":\"gl\",\"hostname\":\"snowplow.trx.gitlab.net\",\"cookieDomain\":\".gitlab.com\",\"appId\":\"gitlab\",\"formTracking\":true,\"linkClickTracking\":true,\"igluRegistryUrl\":null}\n\n\n//]]>\n</script>\n</head>\n\n<body class=\"ui-indigo  gl-browser-generic gl-platform-other\" data-find-file=\"/cznic/golex/find_file/master\" data-group=\"\" data-namespace-id=\"3055233\" data-page=\"projects:blob:show\" data-page-type-id=\"master/LICENSE\" data-project=\"golex\" data-project-id=\"9240939\">\n\n<script nonce=\"0r3eHqYx4WOTsAC6G3fH1Q==\">\n//<![CDATA[\ngl = window.gl || {};\ngl.client = {\"isGeneric\":true,\"isOther\":true};\n\n\n//]]>\n</script>\n\n\n<header class=\"navbar navbar-gitlab navbar-expand-sm js-navbar\" data-qa-selector=\"navbar\">\n<a class=\"sr-only gl-accessibility\" href=\"#content-body\" tabindex=\"1\">Skip to content</a>\n<div class=\"container-fluid\">\n<div class=\"header-content\">\n<div class=\"title-container\">\n<h1 class=\"title\">\n<a title=\"Dashboard\" id=\"logo\" href=\"/\"><svg width=\"24\" height=\"24\" class=\"tanuki-logo\" viewBox=\"0 0 36 36\">\n  <path class=\"tanuki-shape tanuki-left-ear\" fill=\"#e24329\" d=\"M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-right-ear\" fill=\"#e24329\" d=\"M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-nose\" fill=\"#e24329\" d=\"M18,34.38 3,14 33,14 Z\"/>\n  <path class=\"tanuki-shape tanuki-left-eye\" fill=\"#fc6d26\" d=\"M18,34.38 11.38,14 2,14 6,25Z\"/>\n  <path class=\"tanuki-shape tanuki-right-eye\" fill=\"#fc6d26\" d=\"M18,34.38 24.62,14 34,14 30,25Z\"/>\n  <path class=\"tanuki-shape tanuki-left-cheek\" fill=\"#fca326\" d=\"M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z\"/>\n  <path class=\"tanuki-shape tanuki-right-cheek\" fill=\"#fca326\" d=\"M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z\"/>\n</svg>\n\n<span class=\"logo-text d-none d-lg-block prepend-left-8\">\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 617 169\"><path d=\"M315.26 2.97h-21.8l.1 162.5h88.3v-20.1h-66.5l-.1-142.4M465.89 136.95c-5.5 5.7-14.6 11.4-27 11.4-16.6 0-23.3-8.2-23.3-18.9 0-16.1 11.2-23.8 35-23.8 4.5 0 11.7.5 15.4 1.2v30.1h-.1m-22.6-98.5c-17.6 0-33.8 6.2-46.4 16.7l7.7 13.4c8.9-5.2 19.8-10.4 35.5-10.4 17.9 0 25.8 9.2 25.8 24.6v7.9c-3.5-.7-10.7-1.2-15.1-1.2-38.2 0-57.6 13.4-57.6 41.4 0 25.1 15.4 37.7 38.7 37.7 15.7 0 30.8-7.2 36-18.9l4 15.9h15.4v-83.2c-.1-26.3-11.5-43.9-44-43.9M557.63 149.1c-8.2 0-15.4-1-20.8-3.5V70.5c7.4-6.2 16.6-10.7 28.3-10.7 21.1 0 29.2 14.9 29.2 39 0 34.2-13.1 50.3-36.7 50.3m9.2-110.6c-19.5 0-30 13.3-30 13.3v-21l-.1-27.8h-21.3l.1 158.5c10.7 4.5 25.3 6.9 41.2 6.9 40.7 0 60.3-26 60.3-70.9-.1-35.5-18.2-59-50.2-59M77.9 20.6c19.3 0 31.8 6.4 39.9 12.9l9.4-16.3C114.5 6 97.3 0 78.9 0 32.5 0 0 28.3 0 85.4c0 59.8 35.1 83.1 75.2 83.1 20.1 0 37.2-4.7 48.4-9.4l-.5-63.9V75.1H63.6v20.1h38l.5 48.5c-5 2.5-13.6 4.5-25.3 4.5-32.2 0-53.8-20.3-53.8-63-.1-43.5 22.2-64.6 54.9-64.6M231.43 2.95h-21.3l.1 27.3v94.3c0 26.3 11.4 43.9 43.9 43.9 4.5 0 8.9-.4 13.1-1.2v-19.1c-3.1.5-6.4.7-9.9.7-17.9 0-25.8-9.2-25.8-24.6v-65h35.7v-17.8h-35.7l-.1-38.5M155.96 165.47h21.3v-124h-21.3v124M155.96 24.37h21.3V3.07h-21.3v21.3\"/></svg>\n\n</span>\n</a></h1>\n<ul class=\"list-unstyled navbar-sub-nav\">\n<li class=\"home\"><a title=\"Projects\" class=\"dashboard-shortcuts-projects\" href=\"/explore\">Projects\n</a></li><li class=\"\"><a title=\"Groups\" class=\"dashboard-shortcuts-groups\" href=\"/explore/groups\">Groups\n</a></li><li class=\"\"><a title=\"Snippets\" class=\"dashboard-shortcuts-snippets\" href=\"/explore/snippets\">Snippets\n</a></li><li>\n<a title=\"About GitLab CE\" href=\"/help\">Help</a>\n</li>\n</ul>\n\n</div>\n<div class=\"navbar-collapse collapse\">\n<ul class=\"nav navbar-nav\">\n<li class=\"nav-item d-none d-lg-block m-auto\">\n<div class=\"search search-form\" data-track-event=\"activate_form_input\" data-track-label=\"navbar_search\" data-track-value=\"\">\n<form class=\"form-inline\" action=\"/search\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><div class=\"search-input-container\">\n<div class=\"search-input-wrap\">\n<div class=\"dropdown\" data-url=\"/search/autocomplete\">\n<input type=\"search\" name=\"search\" id=\"search\" placeholder=\"Search or jump to…\" class=\"search-input dropdown-menu-toggle no-outline js-search-dashboard-options\" spellcheck=\"false\" tabindex=\"1\" autocomplete=\"off\" data-issues-path=\"/dashboard/issues\" data-mr-path=\"/dashboard/merge_requests\" data-qa-selector=\"search_term_field\" aria-label=\"Search or jump to…\" />\n<button class=\"hidden js-dropdown-search-toggle\" data-toggle=\"dropdown\" type=\"button\"></button>\n<div class=\"dropdown-menu dropdown-select js-dashboard-search-options\">\n<div class=\"dropdown-content\"><ul>\n<li class=\"dropdown-menu-empty-item\">\n<a>\nLoading...\n</a>\n</li>\n</ul>\n</div><div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n<svg class=\"s16 search-icon\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n<svg class=\"s16 clear-icon js-clear-input\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</div>\n</div>\n</div>\n<input type=\"hidden\" name=\"group_id\" id=\"group_id\" class=\"js-search-group-options\" />\n<input type=\"hidden\" name=\"project_id\" id=\"search_project_id\" value=\"9240939\" class=\"js-search-project-options\" data-project-path=\"golex\" data-name=\"golex\" data-issues-path=\"/cznic/golex/issues\" data-mr-path=\"/cznic/golex/merge_requests\" data-issues-disabled=\"false\" />\n<input type=\"hidden\" name=\"search_code\" id=\"search_code\" value=\"true\" />\n<input type=\"hidden\" name=\"repository_ref\" id=\"repository_ref\" value=\"master\" />\n<input type=\"hidden\" name=\"nav_source\" id=\"nav_source\" value=\"navbar\" />\n<div class=\"search-autocomplete-opts hide\" data-autocomplete-path=\"/search/autocomplete\" data-autocomplete-project-id=\"9240939\" data-autocomplete-project-ref=\"master\"></div>\n</form></div>\n\n</li>\n<li class=\"nav-item d-inline-block d-lg-none\">\n<a title=\"Search\" aria-label=\"Search\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" href=\"/search?project_id=9240939\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n</a></li>\n<li class=\"nav-item header-help dropdown d-none d-md-block\">\n<a class=\"header-help-dropdown-toggle\" data-toggle=\"dropdown\" href=\"/help\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#question\"></use></svg>\n<svg class=\"caret-down\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-down\"></use></svg>\n</a><div class=\"dropdown-menu dropdown-menu-right\">\n<ul>\n<li>\n<a href=\"/help\">Help</a>\n</li>\n<li>\n<a href=\"https://about.gitlab.com/getting-help/\">Support</a>\n</li>\n\n<li class=\"divider\"></li>\n<li>\n<a href=\"https://about.gitlab.com/submit-feedback\">Submit feedback</a>\n</li>\n<li>\n<a target=\"_blank\" class=\"text-nowrap\" href=\"https://about.gitlab.com/contributing\">Contribute to GitLab\n</a>\n\n</li>\n\n<li>\n<a href=\"https://next.gitlab.com/\">Switch to GitLab Next</a>\n</li>\n</ul>\n\n</div>\n</li>\n<li class=\"nav-item\">\n<div>\n<a class=\"btn btn-sign-in\" href=\"/users/sign_in?redirect_to_referer=yes\">Sign in / Register</a>\n</div>\n</li>\n</ul>\n</div>\n<button class=\"navbar-toggler d-block d-sm-none\" type=\"button\">\n<span class=\"sr-only\">Toggle navigation</span>\n<svg class=\"s12 more-icon js-navbar-toggle-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#ellipsis_h\"></use></svg>\n<svg class=\"s12 close-icon js-navbar-toggle-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</button>\n</div>\n</div>\n</header>\n\n<div class=\"layout-page page-with-contextual-sidebar\">\n<div class=\"nav-sidebar\">\n<div class=\"nav-sidebar-inner-scroll\">\n<div class=\"context-header\">\n<a title=\"golex\" href=\"/cznic/golex\"><div class=\"avatar-container rect-avatar s40 project-avatar\">\n<div class=\"avatar s40 avatar-tile identicon bg2\">G</div>\n</div>\n<div class=\"sidebar-context-title\">\ngolex\n</div>\n</a></div>\n<ul class=\"sidebar-top-level-items\">\n<li class=\"home\"><a class=\"shortcuts-project rspec-project-link\" data-qa-selector=\"project_link\" href=\"/cznic/golex\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#home\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nProject overview\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex\"><strong class=\"fly-out-top-item-name\">\nProject overview\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Project details\" class=\"shortcuts-project\" href=\"/cznic/golex\"><span>Details</span>\n</a></li><li class=\"\"><a title=\"Activity\" class=\"shortcuts-project-activity\" data-qa-selector=\"activity_link\" href=\"/cznic/golex/activity\"><span>Activity</span>\n</a></li><li class=\"\"><a title=\"Releases\" class=\"shortcuts-project-releases\" href=\"/cznic/golex/-/releases\"><span>Releases</span>\n</a></li><li class=\"\"><a title=\"Cycle Analytics\" class=\"shortcuts-project-cycle-analytics\" href=\"/cznic/golex/-/cycle_analytics\"><span>Cycle Analytics</span>\n</a></li><li class=\"\"><a title=\"Insights\" class=\"shortcuts-project-insights\" data-qa-selector=\"project_insights_link\" href=\"/cznic/golex/insights/\"><span>Insights</span>\n</a></li>\n</ul>\n</li><li class=\"active\"><a class=\"shortcuts-tree qa-project-menu-repo\" href=\"/cznic/golex/tree/master\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-text\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-repo-link\">\nRepository\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item active\"><a href=\"/cznic/golex/tree/master\"><strong class=\"fly-out-top-item-name\">\nRepository\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"active\"><a href=\"/cznic/golex/tree/master\">Files\n</a></li><li class=\"\"><a id=\"js-onboarding-commits-link\" href=\"/cznic/golex/commits/master\">Commits\n</a></li><li class=\"\"><a class=\"qa-branches-link\" id=\"js-onboarding-branches-link\" href=\"/cznic/golex/-/branches\">Branches\n</a></li><li class=\"\"><a href=\"/cznic/golex/-/tags\">Tags\n</a></li><li class=\"\"><a href=\"/cznic/golex/-/graphs/master\">Contributors\n</a></li><li class=\"\"><a href=\"/cznic/golex/-/network/master\">Graph\n</a></li><li class=\"\"><a href=\"/cznic/golex/compare?from=master&amp;to=master\">Compare\n</a></li><li class=\"\"><a href=\"/cznic/golex/-/graphs/master/charts\">Charts\n</a></li><li class=\"\"><a data-qa-selector=\"path_locks_link\" href=\"/cznic/golex/path_locks\">Locked Files\n</a></li>\n</ul>\n</li><li class=\"\"><a class=\"shortcuts-issues qa-issues-item\" href=\"/cznic/golex/issues\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#issues\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-issues-link\">\nIssues\n</span>\n<span class=\"badge badge-pill count issue_counter\">\n1\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/issues\"><strong class=\"fly-out-top-item-name\">\nIssues\n</strong>\n<span class=\"badge badge-pill count issue_counter fly-out-badge\">\n1\n</span>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Issues\" href=\"/cznic/golex/issues\"><span>\nList\n</span>\n</a></li><li class=\"\"><a title=\"Boards\" data-qa-selector=\"issue_boards_link\" href=\"/cznic/golex/-/boards\"><span>\nBoards\n</span>\n</a></li><li class=\"\"><a title=\"Labels\" class=\"qa-labels-link\" href=\"/cznic/golex/-/labels\"><span>\nLabels\n</span>\n</a></li><li class=\"\"><a title=\"Service Desk\" href=\"/cznic/golex/issues/service_desk\">Service Desk\n</a></li>\n<li class=\"\"><a title=\"Milestones\" class=\"qa-milestones-link\" href=\"/cznic/golex/-/milestones\"><span>\nMilestones\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-merge_requests\" data-qa-selector=\"merge_requests_link\" href=\"/cznic/golex/merge_requests\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#git-merge\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-mr-link\">\nMerge Requests\n</span>\n<span class=\"badge badge-pill count merge_counter js-merge-counter\">\n0\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/merge_requests\"><strong class=\"fly-out-top-item-name\">\nMerge Requests\n</strong>\n<span class=\"badge badge-pill count merge_counter js-merge-counter fly-out-badge\">\n0\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-pipelines qa-link-pipelines rspec-link-pipelines\" data-qa-selector=\"ci_cd_link\" href=\"/cznic/golex/pipelines\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#rocket\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-pipelines-link\">\nCI / CD\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/pipelines\"><strong class=\"fly-out-top-item-name\">\nCI / CD\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Pipelines\" class=\"shortcuts-pipelines\" href=\"/cznic/golex/pipelines\"><span>\nPipelines\n</span>\n</a></li><li class=\"\"><a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/golex/-/jobs\"><span>\nJobs\n</span>\n</a></li><li class=\"\"><a title=\"Schedules\" class=\"shortcuts-builds\" href=\"/cznic/golex/pipeline_schedules\"><span>\nSchedules\n</span>\n</a></li><li class=\"\"><a title=\"Charts\" class=\"shortcuts-pipelines-charts\" href=\"/cznic/golex/pipelines/charts\"><span>\nCharts\n</span>\n</a></li></ul>\n</li><li class=\"\"><a data-qa-selector=\"dependency_list_link\" href=\"/cznic/golex/dependencies\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#shield\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSecurity &amp; Compliance\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/dependencies\"><strong class=\"fly-out-top-item-name\">\nSecurity &amp; Compliance\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Dependency List\" data-qa-selector=\"dependency_list_link\" href=\"/cznic/golex/dependencies\"><span>Dependency List</span>\n</a></li><li class=\"\"><a title=\"License Compliance\" data-qa-selector=\"licenses_list_link\" href=\"/cznic/golex/-/licenses\"><span>License Compliance</span>\n</a></li></ul>\n</li>\n<li class=\"\"><a data-qa-selector=\"packages_link\" href=\"/cznic/golex/-/packages\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#package\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nPackages\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/-/packages\"><strong class=\"fly-out-top-item-name\">\nPackages\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Packages\" href=\"/cznic/golex/-/packages\"><span>List</span>\n</a></li><li class=\"\"><a class=\"shortcuts-container-registry\" title=\"Container Registry\" href=\"/cznic/golex/container_registry\"><span>Container Registry</span>\n</a></li></ul>\n</li>\n\n<li class=\"\"><a class=\"shortcuts-wiki\" data-qa-selector=\"wiki_link\" href=\"/cznic/golex/-/wikis/home\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#book\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nWiki\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/-/wikis/home\"><strong class=\"fly-out-top-item-name\">\nWiki\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-snippets\" href=\"/cznic/golex/snippets\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#snippet\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSnippets\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/snippets\"><strong class=\"fly-out-top-item-name\">\nSnippets\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a title=\"Members\" class=\"shortcuts-tree\" href=\"/cznic/golex/-/settings/members\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#users\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nMembers\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/golex/-/project_members\"><strong class=\"fly-out-top-item-name\">\nMembers\n</strong>\n</a></li></ul>\n</li><a class=\"toggle-sidebar-button js-toggle-sidebar qa-toggle-sidebar rspec-toggle-sidebar\" role=\"button\" title=\"Toggle sidebar\" type=\"button\">\n<svg class=\"icon-angle-double-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-left\"></use></svg>\n<svg class=\"icon-angle-double-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-right\"></use></svg>\n<span class=\"collapse-text\">Collapse sidebar</span>\n</a>\n<button name=\"button\" type=\"button\" class=\"close-nav-button\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n<span class=\"collapse-text\">Close sidebar</span>\n</button>\n<li class=\"hidden\">\n<a title=\"Activity\" class=\"shortcuts-project-activity\" href=\"/cznic/golex/activity\"><span>\nActivity\n</span>\n</a></li>\n<li class=\"hidden\">\n<a title=\"Network\" class=\"shortcuts-network\" href=\"/cznic/golex/-/network/master\">Graph\n</a></li>\n<li class=\"hidden\">\n<a title=\"Charts\" class=\"shortcuts-repository-charts\" href=\"/cznic/golex/-/graphs/master/charts\">Charts\n</a></li>\n<li class=\"hidden\">\n<a class=\"shortcuts-new-issue\" href=\"/cznic/golex/issues/new\">Create a new issue\n</a></li>\n<li class=\"hidden\">\n<a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/golex/-/jobs\">Jobs\n</a></li>\n<li class=\"hidden\">\n<a title=\"Commits\" class=\"shortcuts-commits\" href=\"/cznic/golex/commits/master\">Commits\n</a></li>\n<li class=\"hidden\">\n<a title=\"Issue Boards\" class=\"shortcuts-issue-boards\" href=\"/cznic/golex/-/boards\">Issue Boards</a>\n</li>\n</ul>\n</div>\n</div>\n\n<div class=\"content-wrapper\">\n\n<div class=\"mobile-overlay\"></div>\n<div class=\"alert-wrapper\">\n\n\n\n\n\n\n<nav class=\"breadcrumbs container-fluid container-limited\" role=\"navigation\">\n<div class=\"breadcrumbs-container\">\n<button name=\"button\" type=\"button\" class=\"toggle-mobile-nav\"><span class=\"sr-only\">Open sidebar</span>\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-bars\"></i>\n</button><div class=\"breadcrumbs-links js-title-container\">\n<ul class=\"list-unstyled breadcrumbs-list js-breadcrumbs-list\">\n<li><a href=\"/cznic\">cznic</a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li> <li><a href=\"/cznic/golex\"><span class=\"breadcrumb-item-text js-breadcrumb-item-text\">golex</span></a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li>\n\n<li>\n<h2 class=\"breadcrumbs-sub-title\"><a href=\"/cznic/golex/blob/master/LICENSE\">Repository</a></h2>\n</li>\n</ul>\n</div>\n\n</div>\n</nav>\n\n<div class=\"d-flex\"></div>\n</div>\n<div class=\"container-fluid container-limited \">\n<div class=\"content\" id=\"content-body\">\n<div class=\"flash-container flash-container-page sticky\">\n</div>\n\n<div class=\"js-signature-container\" data-signatures-path=\"/cznic/golex/commits/c6cd22df963b45eccd842292c5871756d146cc61/signatures?limit=1\"></div>\n\n<div class=\"tree-holder\" id=\"tree-holder\">\n<div class=\"nav-block\">\n<div class=\"tree-ref-container\">\n<div class=\"tree-ref-holder\">\n<form class=\"project-refs-form\" action=\"/cznic/golex/refs/switch\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"destination\" id=\"destination\" value=\"blob\" />\n<input type=\"hidden\" name=\"path\" id=\"path\" value=\"LICENSE\" />\n<div class=\"dropdown\">\n<button class=\"dropdown-menu-toggle js-project-refs-dropdown qa-branches-select\" type=\"button\" data-toggle=\"dropdown\" data-selected=\"master\" data-ref=\"master\" data-refs-url=\"/cznic/golex/refs?sort=updated_desc\" data-field-name=\"ref\" data-submit-form-on-click=\"true\" data-visit=\"true\"><span class=\"dropdown-toggle-text \">master</span><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-chevron-down\"></i></button>\n<div class=\"dropdown-menu dropdown-menu-paging dropdown-menu-selectable git-revision-dropdown qa-branches-dropdown\">\n<div class=\"dropdown-page-one\">\n<div class=\"dropdown-title\"><span>Switch branch/tag</span><button class=\"dropdown-title-button dropdown-menu-close\" aria-label=\"Close\" type=\"button\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-times dropdown-menu-close-icon\"></i></button></div>\n<div class=\"dropdown-input\"><input type=\"search\" id=\"\" class=\"dropdown-input-field qa-dropdown-input-field\" placeholder=\"Search branches and tags\" autocomplete=\"off\" /><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search dropdown-input-search\"></i><i aria-hidden=\"true\" data-hidden=\"true\" role=\"button\" class=\"fa fa-times dropdown-input-clear js-dropdown-input-clear\"></i></div>\n<div class=\"dropdown-content\"></div>\n<div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n</div>\n</div>\n</form>\n</div>\n<ul class=\"breadcrumb repo-breadcrumb\">\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/golex/tree/master\">golex\n</a></li>\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/golex/blob/master/LICENSE\"><strong>LICENSE</strong>\n</a></li>\n</ul>\n</div>\n<div class=\"tree-controls\"><a class=\"btn shortcuts-find-file\" rel=\"nofollow\" href=\"/cznic/golex/find_file/master\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search\"></i>\n<span>Find file</span>\n</a><a class=\"btn js-blob-blame-link\" href=\"/cznic/golex/blame/master/LICENSE\">Blame</a><a class=\"btn\" href=\"/cznic/golex/commits/master/LICENSE\">History</a><a class=\"btn js-data-file-blob-permalink-url\" href=\"/cznic/golex/blob/b0a198c2a94f85ae899f6014e889a5390c0303c7/LICENSE\">Permalink</a></div>\n</div>\n\n<div class=\"info-well d-none d-sm-block\">\n<div class=\"well-segment\">\n<ul class=\"blob-commit-info\">\n<li class=\"commit flex-row js-toggle-container\" id=\"commit-c6cd22df\">\n<div class=\"avatar-cell d-none d-sm-block\">\n<a href=\"/cznic\"><img alt=\"cznic&#39;s avatar\" src=\"/uploads/-/system/user/avatar/2447325/avatar.png?width=40\" class=\"avatar s40 d-none d-sm-inline-block\" title=\"cznic\" /></a>\n</div>\n<div class=\"commit-detail flex-list\">\n<div class=\"commit-content qa-commit-content\">\n<a class=\"commit-row-message item-title js-onboarding-commit-item\" href=\"/cznic/golex/commit/c6cd22df963b45eccd842292c5871756d146cc61\">A+C</a>\n<span class=\"commit-row-message d-inline d-sm-none\">\n&middot;\nc6cd22df\n</span>\n<div class=\"committer\">\n<a class=\"commit-author-link js-user-link\" data-user-id=\"2447325\" href=\"/cznic\">cznic</a> authored <time class=\"js-timeago\" title=\"Aug 18, 2014 12:23pm\" datetime=\"2014-08-18T12:23:51Z\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\">Aug 18, 2014</time>\n</div>\n\n</div>\n<div class=\"commit-actions flex-row\">\n\n<div class=\"js-commit-pipeline-status\" data-endpoint=\"/cznic/golex/commit/c6cd22df963b45eccd842292c5871756d146cc61/pipelines?ref=master\"></div>\n<div class=\"commit-sha-group d-none d-sm-flex\">\n<div class=\"label label-monospace monospace\">\nc6cd22df\n</div>\n<button class=\"btn btn btn-default\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-title=\"Copy commit SHA\" data-class=\"btn btn-default\" data-clipboard-text=\"c6cd22df963b45eccd842292c5871756d146cc61\" type=\"button\" title=\"Copy commit SHA\" aria-label=\"Copy commit SHA\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n\n</div>\n</div>\n</div>\n</li>\n\n</ul>\n</div>\n\n<div class=\"well-segment blob-auxiliary-viewer\">\n<div class=\"blob-viewer\" data-type=\"auxiliary\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-balance-scale fa-fw\"></i>\nThis project is licensed under the\n<strong>BSD 3-clause &quot;New&quot; or &quot;Revised&quot; License</strong>.\n<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://choosealicense.com/licenses/bsd-3-clause/\">Learn more</a>\n\n</div>\n\n</div>\n\n</div>\n<div class=\"blob-content-holder\" id=\"blob-content-holder\">\n<article class=\"file-holder\">\n<div class=\"js-file-title file-title-flex-parent\">\n<div class=\"file-header-content\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-file-text-o fa-fw\"></i>\n<strong class=\"file-title-name qa-file-title-name\">\nLICENSE\n</strong>\n<button class=\"btn btn-clipboard btn-transparent\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn-clipboard btn-transparent\" data-title=\"Copy file path\" data-clipboard-text=\"{&quot;text&quot;:&quot;LICENSE&quot;,&quot;gfm&quot;:&quot;`LICENSE`&quot;}\" type=\"button\" title=\"Copy file path\" aria-label=\"Copy file path\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n<small class=\"mr-1\">\n1.45 KB\n</small>\n</div>\n\n<div class=\"file-actions\">\n\n<div class=\"btn-group\" role=\"group\"><a class=\"btn btn-primary js-edit-blob  btn-sm\" href=\"/cznic/golex/edit/master/LICENSE\">Edit</a><a class=\"btn btn-inverted btn-primary ide-edit-button btn-sm\" href=\"/-/ide/project/cznic/golex/edit/master/-/LICENSE\">Web IDE</a></div>\n<div class=\"btn-group\" role=\"group\">\n</div>\n<div class=\"btn-group\" role=\"group\"><button class=\"btn btn btn-sm js-copy-blob-source-btn\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn btn-sm js-copy-blob-source-btn\" data-title=\"Copy file contents\" data-clipboard-target=\".blob-content[data-blob-id=&#39;cbf4063474594d68055c778aab9b29fa37d61c38&#39;]\" type=\"button\" title=\"Copy file contents\" aria-label=\"Copy file contents\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button><a class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open raw\" title=\"Open raw\" data-container=\"body\" href=\"/cznic/golex/raw/master/LICENSE\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-code\"></use></svg></a><a download=\"LICENSE\" class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Download\" title=\"Download\" data-container=\"body\" href=\"/cznic/golex/raw/master/LICENSE?inline=false\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#download\"></use></svg></a></div>\n</div>\n</div>\n\n<script id=\"js-file-lock\" type=\"application/json\">\n{\"path\":\"LICENSE\",\"toggle_path\":\"/cznic/golex/path_locks/toggle\"}\n</script>\n\n\n<div class=\"blob-viewer\" data-type=\"simple\" data-url=\"/cznic/golex/blob/master/LICENSE?format=json&amp;viewer=simple\">\n<div class=\"text-center prepend-top-default append-bottom-default\">\n<i aria-hidden=\"true\" aria-label=\"Loading content…\" class=\"fa fa-spinner fa-spin fa-2x qa-spinner\"></i>\n</div>\n\n</div>\n\n\n</article>\n</div>\n\n<div class=\"modal\" id=\"modal-upload-blob\">\n<div class=\"modal-dialog modal-lg\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3 class=\"page-title\">Replace LICENSE</h3>\n<button aria-label=\"Close\" class=\"close\" data-dismiss=\"modal\" type=\"button\">\n<span aria-hidden>&times;</span>\n</button>\n</div>\n<div class=\"modal-body\">\n<form class=\"js-quick-submit js-upload-blob-form\" data-method=\"put\" action=\"/cznic/golex/update/master/LICENSE\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"_method\" value=\"put\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"0dpcuhg64TVFBotr2eQ/E0Ll6ZlAXpNMalbcAgTvIGdofvv6DzPVLZoBp56ptYKm6fzjtJzzqY7Bj+X5kCthWQ==\" /><div class=\"dropzone\">\n<div class=\"dropzone-previews blob-upload-dropzone-previews\">\n<p class=\"dz-message light\">\nAttach a file by drag &amp; drop or <a class=\"markdown-selector\" href=\"#\">click to upload</a>\n</p>\n</div>\n</div>\n<br>\n<div class=\"dropzone-alerts alert alert-danger data\" style=\"display:none\"></div>\n<div class=\"form-group row commit_message-group\">\n<label class=\"col-form-label col-sm-2\" for=\"commit_message-5ea2277be29e7edb3eaa36a5fd3848dc\">Commit message\n</label><div class=\"col-sm-10\">\n<div class=\"commit-message-container\">\n<div class=\"max-width-marker\"></div>\n<textarea name=\"commit_message\" id=\"commit_message-5ea2277be29e7edb3eaa36a5fd3848dc\" class=\"form-control js-commit-message\" placeholder=\"Replace LICENSE\" required=\"required\" rows=\"3\">\nReplace LICENSE</textarea>\n</div>\n</div>\n</div>\n\n<input type=\"hidden\" name=\"branch_name\" id=\"branch_name\" />\n<input type=\"hidden\" name=\"create_merge_request\" id=\"create_merge_request\" value=\"1\" />\n<input type=\"hidden\" name=\"original_branch\" id=\"original_branch\" value=\"master\" class=\"js-original-branch\" />\n\n<div class=\"form-actions\">\n<button name=\"button\" type=\"button\" class=\"btn btn-success btn-upload-file\" id=\"submit-all\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spin fa-spinner js-loading-icon hidden\"></i>\nReplace file\n</button><a class=\"btn btn-cancel\" data-dismiss=\"modal\" href=\"#\">Cancel</a>\n<div class=\"inline prepend-left-10\">\nA new branch will be created in your fork and a new merge request will be started.\n</div>\n\n</div>\n</form></div>\n</div>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n</div>\n</div>\n\n\n\n\n</body>\n</html>\n\n\n--------------------------------------------------------------------------------\nmodernc.org/mathutil  BSD 3-Clause \"New\" or \"Revised\" License  https://gitlab.com/cznic/mathutil/blob/master/LICENSE\n--------------------------------------------------------------------------------\n<!DOCTYPE html>\n<html class=\"devise-layout-html\">\n<head prefix=\"og: http://ogp.me/ns#\">\n<meta charset=\"utf-8\">\n<link href=\"https://assets.gitlab-static.net\" rel=\"dns-prefetch\">\n<link crossorigin=\"\" href=\"https://assets.gitlab-static.net\" rel=\"preconnnect\">\n<meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\">\n<meta content=\"object\" property=\"og:type\">\n<meta content=\"GitLab\" property=\"og:site_name\">\n<meta content=\"Sign in\" property=\"og:title\">\n<meta content=\"GitLab.com\" property=\"og:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"og:image\">\n<meta content=\"64\" property=\"og:image:width\">\n<meta content=\"64\" property=\"og:image:height\">\n<meta content=\"https://gitlab.com/users/sign_in\" property=\"og:url\">\n<meta content=\"summary\" property=\"twitter:card\">\n<meta content=\"Sign in\" property=\"twitter:title\">\n<meta content=\"GitLab.com\" property=\"twitter:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"twitter:image\">\n\n<title>Sign in · GitLab</title>\n<meta content=\"GitLab.com\" name=\"description\">\n<link rel=\"shortcut icon\" type=\"image/png\" href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" id=\"favicon\" data-original-href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" />\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/application-a6e08192483b8e7eefdaa5a17246c14776ebd30ccf14cf9510edaed797b7fb2d.css\" />\n<link rel=\"stylesheet\" media=\"print\" href=\"https://assets.gitlab-static.net/assets/print-74c3df10dad473d66660c828e3aa54ca3bfeac6d8bb708643331403fe7211e60.css\" />\n\n\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/highlight/themes/white-3144068cf4f603d290f553b653926358ddcd02493b9728f62417682657fc58c0.css\" />\n<script nonce=\"rOWCSXR6bAQqDJ0q8iKf+g==\">\n//<![CDATA[\nwindow.gon={};\n//]]>\n</script>\n\n<script src=\"https://assets.gitlab-static.net/assets/webpack/runtime.e17b7ae7.bundle.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/main.75a7b9a1.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/sentry.281a8c95.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.groups.omniauth_callbacks~pages.ldap.omniauth_callbacks~pages.omniauth_callbacks~pages~577d7818.5a51b502.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/pages.sessions.new.2b842f4e.chunk.js\" defer=\"defer\"></script>\n\n<meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"foh7f3Q1lrla533WQQ9+5qn8ttfV+cQWmyE27ueXkFO+xwSzFRaQ8z66ELZfVTsENTA0LNOx/l4/WW14m2XyTw==\" />\n<meta name=\"csp-nonce\" content=\"rOWCSXR6bAQqDJ0q8iKf+g==\" />\n<meta content=\"origin-when-cross-origin\" name=\"referrer\">\n<meta content=\"width=device-width, initial-scale=1, maximum-scale=1\" name=\"viewport\">\n<meta content=\"#474D57\" name=\"theme-color\">\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-5a9cee0e8a51212e70b90c87c12f382c428870c0ff67d1eb034d884b78d2dae7.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-a6eec6aeb9da138e507593b464fdac213047e49d3093fc30e90d9a995df83ba3.png\" sizes=\"76x76\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-retina-72e2aadf86513a56e050e7f0f2355deaa19cc17ed97bbe5147847f2748e5a3e3.png\" sizes=\"120x120\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png\" sizes=\"152x152\" />\n<link color=\"rgb(226, 67, 41)\" href=\"https://assets.gitlab-static.net/assets/logo-d36b5212042cebc89b96df4bf6ac24e43db316143e89926c0db839ff694d2de4.svg\" rel=\"mask-icon\">\n<meta content=\"https://assets.gitlab-static.net/assets/msapplication-tile-1196ec67452f618d39cdd85e2e3a542f76574c071051ae7effbfde01710eb17d.png\" name=\"msapplication-TileImage\">\n<meta content=\"#30353E\" name=\"msapplication-TileColor\">\n\n\n\n<script nonce=\"rOWCSXR6bAQqDJ0q8iKf+g==\">\n//<![CDATA[\n;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[];\np.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)\n};p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;\nn.src=w;g.parentNode.insertBefore(n,g)}}(window,document,\"script\",\"https://assets.gitlab-static.net/assets/snowplow/sp-e10fd598642f1a4dd3e9e0e026f6a1ffa3c31b8a40efd92db3f92d32873baed6.js\",\"snowplow\"));\n\nwindow.snowplowOptions = {\"namespace\":\"gl\",\"hostname\":\"snowplow.trx.gitlab.net\",\"cookieDomain\":\".gitlab.com\",\"appId\":\"gitlab\",\"formTracking\":true,\"linkClickTracking\":true,\"igluRegistryUrl\":null}\n\n\n//]]>\n</script>\n</head>\n\n<body class=\"application gl-browser-generic gl-platform-other login-page navless ui-indigo\" data-page=\"sessions:new\" data-qa-selector=\"login_page\">\n\n<script nonce=\"rOWCSXR6bAQqDJ0q8iKf+g==\">\n//<![CDATA[\ngl = window.gl || {};\ngl.client = {\"isGeneric\":true,\"isOther\":true};\n\n\n//]]>\n</script>\n<div class=\"page-wrap\">\n<header class=\"navbar fixed-top navbar-empty\">\n<svg width=\"24\" height=\"24\" class=\"tanuki-logo\" viewBox=\"0 0 36 36\">\n  <path class=\"tanuki-shape tanuki-left-ear\" fill=\"#e24329\" d=\"M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-right-ear\" fill=\"#e24329\" d=\"M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-nose\" fill=\"#e24329\" d=\"M18,34.38 3,14 33,14 Z\"/>\n  <path class=\"tanuki-shape tanuki-left-eye\" fill=\"#fc6d26\" d=\"M18,34.38 11.38,14 2,14 6,25Z\"/>\n  <path class=\"tanuki-shape tanuki-right-eye\" fill=\"#fc6d26\" d=\"M18,34.38 24.62,14 34,14 30,25Z\"/>\n  <path class=\"tanuki-shape tanuki-left-cheek\" fill=\"#fca326\" d=\"M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z\"/>\n  <path class=\"tanuki-shape tanuki-right-cheek\" fill=\"#fca326\" d=\"M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z\"/>\n</svg>\n\n</header>\n\n<div class=\"login-page-broadcast\">\n\n</div>\n<div class=\"container navless-container\">\n<div class=\"content\">\n<div class=\"flash-container flash-container-page sticky\">\n<div class=\"flash-alert mb-2\">\n<svg class=\"s16 align-middle mr-1\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#error\"></use></svg>\n<span>You need to sign in or sign up before continuing.</span>\n<div class=\"close-icon-wrapper js-close-icon\">\n<svg class=\"s16 close-icon\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</div>\n</div>\n</div>\n\n<div class=\"row mt-3\">\n<div class=\"col-sm-12\">\n<h1 class=\"mb-3 font-weight-normal\">\nGitLab.com\n</h1>\n</div>\n</div>\n<div class=\"row mb-3\">\n<div class=\"col-sm-7 order-12 order-sm-1 brand-holder\">\n\n<p data-sourcepos=\"1:1-1:84\" dir=\"auto\">GitLab.com offers free unlimited (private) repositories and unlimited collaborators.</p>&#x000A;<ul data-sourcepos=\"3:1-7:0\" dir=\"auto\">&#x000A;<li data-sourcepos=\"3:1-3:98\">&#x000A;<a href=\"https://gitlab.com/explore/projects/trending\">Explore projects on GitLab.com</a> (no login needed)</li>&#x000A;<li data-sourcepos=\"4:1-4:75\"><a href=\"https://about.gitlab.com/gitlab-com/\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">More information about GitLab.com</a></li>&#x000A;<li data-sourcepos=\"5:1-5:80\"><a href=\"https://gitlab.com/gitlab-com/support-forum/issues\">GitLab.com Support Forum</a></li>&#x000A;<li data-sourcepos=\"6:1-7:0\"><a href=\"https://about.gitlab.com\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">GitLab Homepage</a></li>&#x000A;</ul>&#x000A;<p data-sourcepos=\"8:1-8:67\" dir=\"auto\">By signing up for and by signing in to this service you accept our:</p>&#x000A;<ul data-sourcepos=\"10:1-11:65\" dir=\"auto\">&#x000A;<li data-sourcepos=\"10:1-10:53\"><a href=\"https://about.gitlab.com/privacy/\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">Privacy policy</a></li>&#x000A;<li data-sourcepos=\"11:1-11:65\">&#x000A;<a href=\"https://about.gitlab.com/terms/#gitlab_com\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">GitLab.com Terms</a>.</li>&#x000A;</ul>\n\n</div>\n<div class=\"col-sm-5 order-1 order-sm-12 new-session-forms-container\">\n<div id=\"signin-container\">\n<ul class=\"nav-links new-session-tabs nav-tabs nav\" role=\"tablist\">\n<li class=\"nav-item\" role=\"presentation\">\n<a class=\"nav-link active\" data-qa-selector=\"sign_in_tab\" data-toggle=\"tab\" href=\"#login-pane\" role=\"tab\">Sign in</a>\n</li>\n<li class=\"nav-item\" role=\"presentation\">\n<a class=\"nav-link\" data-qa-selector=\"register_tab\" data-toggle=\"tab\" data-track-event=\"click_button\" data-track-label=\"sign_in_register\" data-track-property=\"\" data-track-value=\"\" href=\"#register-pane\" role=\"tab\">Register</a>\n</li>\n</ul>\n\n<div class=\"tab-content\">\n<div class=\"login-box tab-pane active\" id=\"login-pane\" role=\"tabpanel\">\n<div class=\"login-body\">\n<form class=\"new_user gl-show-field-errors\" id=\"new_user\" aria-live=\"assertive\" action=\"/users/sign_in\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"2222AHTcEjLZom9MHxwp0b8WhvJJSiKN/DVe2V2KDMobIsnMFf8UeL3/AiwBRmwzI9oECU8CGMVYTQVPIXhu1g==\" /><div class=\"form-group\">\n<label for=\"user_login\" class=\"label-bold\">Username or email</label>\n<input class=\"form-control top\" autofocus=\"autofocus\" autocapitalize=\"off\" autocorrect=\"off\" required=\"required\" title=\"This field is required.\" data-qa-selector=\"login_field\" type=\"text\" name=\"user[login]\" id=\"user_login\" />\n</div>\n<div class=\"form-group\">\n<label class=\"label-bold\" for=\"user_password\">Password</label>\n<input class=\"form-control bottom\" required=\"required\" title=\"This field is required.\" data-qa-selector=\"password_field\" type=\"password\" name=\"user[password]\" id=\"user_password\" />\n</div>\n<div class=\"remember-me\">\n<label for=\"user_remember_me\">\n<input name=\"user[remember_me]\" type=\"hidden\" value=\"0\" /><input class=\"remember-me-checkbox\" type=\"checkbox\" value=\"1\" name=\"user[remember_me]\" id=\"user_remember_me\" />\n<span>Remember me</span>\n</label>\n<div class=\"float-right\">\n<a href=\"/users/password/new\">Forgot your password?</a>\n</div>\n</div>\n<div></div>\n<div class=\"submit-container move-submit-down\">\n<input type=\"submit\" name=\"commit\" value=\"Sign in\" class=\"btn btn-success\" data-qa-selector=\"sign_in_button\" data-disable-with=\"Sign in\" />\n</div>\n</form>\n</div>\n</div>\n\n<div class=\"tab-pane login-box\" id=\"register-pane\" role=\"tabpanel\">\n<div class=\"login-body\">\n<form class=\"new_new_user gl-show-field-errors\" id=\"new_new_user\" aria-live=\"assertive\" action=\"/users\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"StAfm56qaFeA1dRlGRqx0qFMxvokBiEOKDT1fsBtnCGKn2BX/4luHeSIuQUHQPQwPYBEASJOG0aMTK7ovJ/+PQ==\" /><div class=\"devise-errors\">\n\n</div>\n<div class=\"name form-group\">\n<label class=\"label-bold\" for=\"new_user_name\">Full name</label>\n<input class=\"form-control top js-block-emoji js-validate-length\" data-max-length=\"128\" data-max-length-message=\"Name is too long (maximum is 128 characters).\" data-qa-selector=\"new_user_name_field\" required=\"required\" title=\"This field is required.\" type=\"text\" name=\"new_user[name]\" id=\"new_user_name\" />\n</div>\n<div class=\"username form-group\">\n<label class=\"label-bold\" for=\"new_user_username\">Username</label>\n<input class=\"form-control middle js-block-emoji js-validate-length js-validate-username\" data-max-length=\"255\" data-max-length-message=\"Username is too long (maximum is 255 characters).\" data-qa-selector=\"new_user_username_field\" pattern=\"[a-zA-Z0-9_\\.][a-zA-Z0-9_\\-\\.]*[a-zA-Z0-9_\\-]|[a-zA-Z0-9_]\" required=\"required\" title=\"Please create a username with only alphanumeric characters.\" type=\"text\" name=\"new_user[username]\" id=\"new_user_username\" />\n<p class=\"validation-error gl-field-error-ignore field-validation hide\">Username is already taken.</p>\n<p class=\"validation-success gl-field-error-ignore field-validation hide\">Username is available.</p>\n<p class=\"validation-pending gl-field-error-ignore field-validation hide\">Checking username availability...</p>\n</div>\n<div class=\"form-group\">\n<label class=\"label-bold\" for=\"new_user_email\">Email</label>\n<input class=\"form-control middle\" data-qa-selector=\"new_user_email_field\" required=\"required\" title=\"Please provide a valid email address.\" type=\"email\" value=\"\" name=\"new_user[email]\" id=\"new_user_email\" />\n</div>\n<div class=\"form-group\">\n<label class=\"label-bold\" for=\"new_user_email_confirmation\">Email confirmation</label>\n<input class=\"form-control middle\" data-qa-selector=\"new_user_email_confirmation_field\" required=\"required\" title=\"Please retype the email address.\" type=\"email\" name=\"new_user[email_confirmation]\" id=\"new_user_email_confirmation\" />\n</div>\n<div class=\"form-group append-bottom-20\" id=\"password-strength\">\n<label class=\"label-bold\" for=\"new_user_password\">Password</label>\n<input class=\"form-control bottom\" data-qa-selector=\"new_user_password_field\" required=\"required\" pattern=\".{8,}\" title=\"Minimum length is 8 characters.\" type=\"password\" name=\"new_user[password]\" id=\"new_user_password\" />\n<p class=\"gl-field-hint text-secondary\">Minimum length is 8 characters</p>\n</div>\n<div class=\"form-group\">\n<input type=\"checkbox\" name=\"terms_opt_in\" id=\"terms_opt_in\" value=\"1\" required=\"required\" data-qa-selector=\"new_user_accept_terms_checkbox\" />\n<label for=\"terms_opt_in\">I accept the <a target=\"_blank\" href=\"/-/users/terms\">Terms of Service and Privacy Policy</a>\n</label></div>\n<div class=\"form-group\">\n<input name=\"new_user[email_opted_in]\" type=\"hidden\" value=\"0\" /><input type=\"checkbox\" value=\"1\" name=\"new_user[email_opted_in]\" id=\"new_user_email_opted_in\" />\n<label for=\"new_user_email_opted_in\">I&#39;d like to receive updates via email about GitLab.</label>\n</div>\n\n<div></div>\n<script src=\"https://www.google.com/recaptcha/api.js\" async defer></script>\n<div data-sitekey=\"6LfAERQTAAAAAL4GYSiAMGLbcLyUIBSfPrDNJgeC\" class=\"g-recaptcha \"></div>\n          <noscript>\n            <div>\n              <div style=\"width: 302px; height: 422px; position: relative;\">\n                <div style=\"width: 302px; height: 422px; position: absolute;\">\n                  <iframe\n                    src=\"https://www.google.com/recaptcha/api/fallback?k=6LfAERQTAAAAAL4GYSiAMGLbcLyUIBSfPrDNJgeC\"\n                    scrolling=\"no\" name=\"ReCAPTCHA\"\n                    style=\"width: 302px; height: 422px; border-style: none; border: 0;\">\n                  </iframe>\n                </div>\n              </div>\n              <div style=\"width: 300px; height: 60px; border-style: none;\n                bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px;\n                background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;\">\n                <textarea id=\"g-recaptcha-response\" name=\"g-recaptcha-response\"\n                  class=\"g-recaptcha-response\"\n                  style=\"width: 250px; height: 40px; border: 1px solid #c1c1c1;\n                  margin: 10px 25px; padding: 0px; resize: none;\">\n                </textarea>\n              </div>\n            </div>\n          </noscript>\n\n<div class=\"submit-container\">\n<input type=\"submit\" name=\"commit\" value=\"Register\" class=\"btn-register btn\" data-qa-selector=\"new_user_register_button\" data-disable-with=\"Register\" />\n</div>\n</form></div>\n</div>\n\n</div>\n<div class=\"clearfix\">\n<div class=\"omniauth-container prepend-top-15\">\n<label class=\"label-bold d-block\">\nSign in with\n</label>\n<div class=\"d-flex justify-content-between flex-wrap\">\n<a class=\"btn d-flex align-items-center omniauth-btn text-left oauth-login \" id=\"oauth-login-google_oauth2\" rel=\"nofollow\" data-method=\"post\" href=\"/users/auth/google_oauth2\"><img alt=\"Google\" title=\"Sign in with Google\" data-src=\"https://assets.gitlab-static.net/assets/auth_buttons/google_64-9ab7462cd2115e11f80171018d8c39bd493fc375e83202fbb6d37a487ad01908.png\" class=\"lazy\" src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" />\n<span>\nGoogle\n</span>\n</a><a class=\"btn d-flex align-items-center omniauth-btn text-left oauth-login \" id=\"oauth-login-twitter\" rel=\"nofollow\" data-method=\"post\" href=\"/users/auth/twitter\"><img alt=\"Twitter\" title=\"Sign in with Twitter\" data-src=\"https://assets.gitlab-static.net/assets/auth_buttons/twitter_64-86860edb139fb2f62fc25ef62a4213a5c8b20122fd8752ab0df09e740eb53deb.png\" class=\"lazy\" src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" />\n<span>\nTwitter\n</span>\n</a><a class=\"btn d-flex align-items-center omniauth-btn text-left oauth-login qa-github-login-button\" id=\"oauth-login-github\" rel=\"nofollow\" data-method=\"post\" href=\"/users/auth/github\"><img alt=\"GitHub\" title=\"Sign in with GitHub\" data-src=\"https://assets.gitlab-static.net/assets/auth_buttons/github_64-84041cd0ea392220da96f0fb9b9473c08485c4924b98c776be1bd33b0daab8c0.png\" class=\"lazy\" src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" />\n<span>\nGitHub\n</span>\n</a><a class=\"btn d-flex align-items-center omniauth-btn text-left oauth-login \" id=\"oauth-login-bitbucket\" rel=\"nofollow\" data-method=\"post\" href=\"/users/auth/bitbucket\"><img alt=\"Bitbucket\" title=\"Sign in with Bitbucket\" data-src=\"https://assets.gitlab-static.net/assets/auth_buttons/bitbucket_64-267f322b8bedf1a39970bc215a2eb9e862c8c8033ff2390840607cb0e2dd0daf.png\" class=\"lazy\" src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" />\n<span>\nBitbucket\n</span>\n</a><a class=\"btn d-flex align-items-center omniauth-btn text-left oauth-login \" id=\"oauth-login-salesforce\" rel=\"nofollow\" data-method=\"post\" href=\"/users/auth/salesforce\"><img alt=\"Salesforce\" title=\"Sign in with Salesforce\" data-src=\"https://assets.gitlab-static.net/assets/auth_buttons/salesforce_64-3f0cb95b231cc615e09bb96d54ccaf562d729b21f255270e03d98b17466bd61f.png\" class=\"lazy\" src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" />\n<span>\nSalesforce\n</span>\n</a></div>\n<fieldset class=\"remember-me\">\n<label>\n<input type=\"checkbox\" name=\"remember_me\" id=\"remember_me\" class=\"remember-me-checkbox\" />\n<span>\nRemember me\n</span>\n</label>\n</fieldset>\n</div>\n\n</div>\n</div>\n\n</div>\n</div>\n</div>\n</div>\n<hr class=\"footer-fixed\">\n<div class=\"container footer-container\">\n<div class=\"footer-links\">\n<a href=\"/explore\">Explore</a>\n<a href=\"/help\">Help</a>\n<a href=\"https://about.gitlab.com/\">About GitLab</a>\n</div>\n</div>\n\n</div>\n</body>\n</html>\n\n--------------------------------------------------------------------------------\nmodernc.org/strutil  BSD 3-Clause \"New\" or \"Revised\" License  https://gitlab.com/cznic/strutil/blob/master/LICENSE\n--------------------------------------------------------------------------------\n<!DOCTYPE html>\n<html class=\"\" lang=\"en\">\n<head prefix=\"og: http://ogp.me/ns#\">\n<meta charset=\"utf-8\">\n<link href=\"https://assets.gitlab-static.net\" rel=\"dns-prefetch\">\n<link crossorigin=\"\" href=\"https://assets.gitlab-static.net\" rel=\"preconnnect\">\n<meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\">\n<meta content=\"object\" property=\"og:type\">\n<meta content=\"GitLab\" property=\"og:site_name\">\n<meta content=\"LICENSE · master · cznic / strutil\" property=\"og:title\">\n<meta content=\"Package strutil collects utils supplemental to the standard strings package.\" property=\"og:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"og:image\">\n<meta content=\"64\" property=\"og:image:width\">\n<meta content=\"64\" property=\"og:image:height\">\n<meta content=\"https://gitlab.com/cznic/strutil/blob/master/LICENSE\" property=\"og:url\">\n<meta content=\"summary\" property=\"twitter:card\">\n<meta content=\"LICENSE · master · cznic / strutil\" property=\"twitter:title\">\n<meta content=\"Package strutil collects utils supplemental to the standard strings package.\" property=\"twitter:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"twitter:image\">\n\n<title>LICENSE · master · cznic / strutil · GitLab</title>\n<meta content=\"Package strutil collects utils supplemental to the standard strings package.\" name=\"description\">\n<link rel=\"shortcut icon\" type=\"image/png\" href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" id=\"favicon\" data-original-href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" />\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/application-a6e08192483b8e7eefdaa5a17246c14776ebd30ccf14cf9510edaed797b7fb2d.css\" />\n<link rel=\"stylesheet\" media=\"print\" href=\"https://assets.gitlab-static.net/assets/print-74c3df10dad473d66660c828e3aa54ca3bfeac6d8bb708643331403fe7211e60.css\" />\n\n\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/highlight/themes/white-3144068cf4f603d290f553b653926358ddcd02493b9728f62417682657fc58c0.css\" />\n<script nonce=\"PCYgENgzo9cgi1QDknts1Q==\">\n//<![CDATA[\nwindow.gon={};\n//]]>\n</script>\n\n<script src=\"https://assets.gitlab-static.net/assets/webpack/runtime.e17b7ae7.bundle.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/main.75a7b9a1.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/sentry.281a8c95.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.admin.clusters~pages.admin.clusters.destroy~pages.admin.clusters.edit~pages.admin.clus~1ba693ac.ea1d3193.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.groups.epics.index~pages.groups.epics.show~pages.groups.milestones.edit~pages.groups.m~b7d7bc7f.bec192ac.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/pages.projects.blob.show.86ee57df.chunk.js\" defer=\"defer\"></script>\n\n<meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"pzYkIigfALPRXpJDOJ7XVIVZ7MpcJszAcGn7lpPwQHurTKfsui8TGY0p+8QaIQgJQPx3GxvooqcqkpB5C4Jc0w==\" />\n<meta name=\"csp-nonce\" content=\"PCYgENgzo9cgi1QDknts1Q==\" />\n<meta content=\"origin-when-cross-origin\" name=\"referrer\">\n<meta content=\"width=device-width, initial-scale=1, maximum-scale=1\" name=\"viewport\">\n<meta content=\"#474D57\" name=\"theme-color\">\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-5a9cee0e8a51212e70b90c87c12f382c428870c0ff67d1eb034d884b78d2dae7.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-a6eec6aeb9da138e507593b464fdac213047e49d3093fc30e90d9a995df83ba3.png\" sizes=\"76x76\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-retina-72e2aadf86513a56e050e7f0f2355deaa19cc17ed97bbe5147847f2748e5a3e3.png\" sizes=\"120x120\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png\" sizes=\"152x152\" />\n<link color=\"rgb(226, 67, 41)\" href=\"https://assets.gitlab-static.net/assets/logo-d36b5212042cebc89b96df4bf6ac24e43db316143e89926c0db839ff694d2de4.svg\" rel=\"mask-icon\">\n<meta content=\"https://assets.gitlab-static.net/assets/msapplication-tile-1196ec67452f618d39cdd85e2e3a542f76574c071051ae7effbfde01710eb17d.png\" name=\"msapplication-TileImage\">\n<meta content=\"#30353E\" name=\"msapplication-TileColor\">\n\n\n\n<script nonce=\"PCYgENgzo9cgi1QDknts1Q==\">\n//<![CDATA[\n;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[];\np.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)\n};p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;\nn.src=w;g.parentNode.insertBefore(n,g)}}(window,document,\"script\",\"https://assets.gitlab-static.net/assets/snowplow/sp-e10fd598642f1a4dd3e9e0e026f6a1ffa3c31b8a40efd92db3f92d32873baed6.js\",\"snowplow\"));\n\nwindow.snowplowOptions = {\"namespace\":\"gl\",\"hostname\":\"snowplow.trx.gitlab.net\",\"cookieDomain\":\".gitlab.com\",\"appId\":\"gitlab\",\"formTracking\":true,\"linkClickTracking\":true,\"igluRegistryUrl\":null}\n\n\n//]]>\n</script>\n</head>\n\n<body class=\"ui-indigo  gl-browser-generic gl-platform-other\" data-find-file=\"/cznic/strutil/find_file/master\" data-group=\"\" data-namespace-id=\"3055233\" data-page=\"projects:blob:show\" data-page-type-id=\"master/LICENSE\" data-project=\"strutil\" data-project-id=\"9240988\">\n\n<script nonce=\"PCYgENgzo9cgi1QDknts1Q==\">\n//<![CDATA[\ngl = window.gl || {};\ngl.client = {\"isGeneric\":true,\"isOther\":true};\n\n\n//]]>\n</script>\n\n\n<header class=\"navbar navbar-gitlab navbar-expand-sm js-navbar\" data-qa-selector=\"navbar\">\n<a class=\"sr-only gl-accessibility\" href=\"#content-body\" tabindex=\"1\">Skip to content</a>\n<div class=\"container-fluid\">\n<div class=\"header-content\">\n<div class=\"title-container\">\n<h1 class=\"title\">\n<a title=\"Dashboard\" id=\"logo\" href=\"/\"><svg width=\"24\" height=\"24\" class=\"tanuki-logo\" viewBox=\"0 0 36 36\">\n  <path class=\"tanuki-shape tanuki-left-ear\" fill=\"#e24329\" d=\"M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-right-ear\" fill=\"#e24329\" d=\"M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-nose\" fill=\"#e24329\" d=\"M18,34.38 3,14 33,14 Z\"/>\n  <path class=\"tanuki-shape tanuki-left-eye\" fill=\"#fc6d26\" d=\"M18,34.38 11.38,14 2,14 6,25Z\"/>\n  <path class=\"tanuki-shape tanuki-right-eye\" fill=\"#fc6d26\" d=\"M18,34.38 24.62,14 34,14 30,25Z\"/>\n  <path class=\"tanuki-shape tanuki-left-cheek\" fill=\"#fca326\" d=\"M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z\"/>\n  <path class=\"tanuki-shape tanuki-right-cheek\" fill=\"#fca326\" d=\"M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z\"/>\n</svg>\n\n<span class=\"logo-text d-none d-lg-block prepend-left-8\">\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 617 169\"><path d=\"M315.26 2.97h-21.8l.1 162.5h88.3v-20.1h-66.5l-.1-142.4M465.89 136.95c-5.5 5.7-14.6 11.4-27 11.4-16.6 0-23.3-8.2-23.3-18.9 0-16.1 11.2-23.8 35-23.8 4.5 0 11.7.5 15.4 1.2v30.1h-.1m-22.6-98.5c-17.6 0-33.8 6.2-46.4 16.7l7.7 13.4c8.9-5.2 19.8-10.4 35.5-10.4 17.9 0 25.8 9.2 25.8 24.6v7.9c-3.5-.7-10.7-1.2-15.1-1.2-38.2 0-57.6 13.4-57.6 41.4 0 25.1 15.4 37.7 38.7 37.7 15.7 0 30.8-7.2 36-18.9l4 15.9h15.4v-83.2c-.1-26.3-11.5-43.9-44-43.9M557.63 149.1c-8.2 0-15.4-1-20.8-3.5V70.5c7.4-6.2 16.6-10.7 28.3-10.7 21.1 0 29.2 14.9 29.2 39 0 34.2-13.1 50.3-36.7 50.3m9.2-110.6c-19.5 0-30 13.3-30 13.3v-21l-.1-27.8h-21.3l.1 158.5c10.7 4.5 25.3 6.9 41.2 6.9 40.7 0 60.3-26 60.3-70.9-.1-35.5-18.2-59-50.2-59M77.9 20.6c19.3 0 31.8 6.4 39.9 12.9l9.4-16.3C114.5 6 97.3 0 78.9 0 32.5 0 0 28.3 0 85.4c0 59.8 35.1 83.1 75.2 83.1 20.1 0 37.2-4.7 48.4-9.4l-.5-63.9V75.1H63.6v20.1h38l.5 48.5c-5 2.5-13.6 4.5-25.3 4.5-32.2 0-53.8-20.3-53.8-63-.1-43.5 22.2-64.6 54.9-64.6M231.43 2.95h-21.3l.1 27.3v94.3c0 26.3 11.4 43.9 43.9 43.9 4.5 0 8.9-.4 13.1-1.2v-19.1c-3.1.5-6.4.7-9.9.7-17.9 0-25.8-9.2-25.8-24.6v-65h35.7v-17.8h-35.7l-.1-38.5M155.96 165.47h21.3v-124h-21.3v124M155.96 24.37h21.3V3.07h-21.3v21.3\"/></svg>\n\n</span>\n</a></h1>\n<ul class=\"list-unstyled navbar-sub-nav\">\n<li class=\"home\"><a title=\"Projects\" class=\"dashboard-shortcuts-projects\" href=\"/explore\">Projects\n</a></li><li class=\"\"><a title=\"Groups\" class=\"dashboard-shortcuts-groups\" href=\"/explore/groups\">Groups\n</a></li><li class=\"\"><a title=\"Snippets\" class=\"dashboard-shortcuts-snippets\" href=\"/explore/snippets\">Snippets\n</a></li><li>\n<a title=\"About GitLab CE\" href=\"/help\">Help</a>\n</li>\n</ul>\n\n</div>\n<div class=\"navbar-collapse collapse\">\n<ul class=\"nav navbar-nav\">\n<li class=\"nav-item d-none d-lg-block m-auto\">\n<div class=\"search search-form\" data-track-event=\"activate_form_input\" data-track-label=\"navbar_search\" data-track-value=\"\">\n<form class=\"form-inline\" action=\"/search\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><div class=\"search-input-container\">\n<div class=\"search-input-wrap\">\n<div class=\"dropdown\" data-url=\"/search/autocomplete\">\n<input type=\"search\" name=\"search\" id=\"search\" placeholder=\"Search or jump to…\" class=\"search-input dropdown-menu-toggle no-outline js-search-dashboard-options\" spellcheck=\"false\" tabindex=\"1\" autocomplete=\"off\" data-issues-path=\"/dashboard/issues\" data-mr-path=\"/dashboard/merge_requests\" data-qa-selector=\"search_term_field\" aria-label=\"Search or jump to…\" />\n<button class=\"hidden js-dropdown-search-toggle\" data-toggle=\"dropdown\" type=\"button\"></button>\n<div class=\"dropdown-menu dropdown-select js-dashboard-search-options\">\n<div class=\"dropdown-content\"><ul>\n<li class=\"dropdown-menu-empty-item\">\n<a>\nLoading...\n</a>\n</li>\n</ul>\n</div><div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n<svg class=\"s16 search-icon\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n<svg class=\"s16 clear-icon js-clear-input\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</div>\n</div>\n</div>\n<input type=\"hidden\" name=\"group_id\" id=\"group_id\" class=\"js-search-group-options\" />\n<input type=\"hidden\" name=\"project_id\" id=\"search_project_id\" value=\"9240988\" class=\"js-search-project-options\" data-project-path=\"strutil\" data-name=\"strutil\" data-issues-path=\"/cznic/strutil/issues\" data-mr-path=\"/cznic/strutil/merge_requests\" data-issues-disabled=\"false\" />\n<input type=\"hidden\" name=\"search_code\" id=\"search_code\" value=\"true\" />\n<input type=\"hidden\" name=\"repository_ref\" id=\"repository_ref\" value=\"master\" />\n<input type=\"hidden\" name=\"nav_source\" id=\"nav_source\" value=\"navbar\" />\n<div class=\"search-autocomplete-opts hide\" data-autocomplete-path=\"/search/autocomplete\" data-autocomplete-project-id=\"9240988\" data-autocomplete-project-ref=\"master\"></div>\n</form></div>\n\n</li>\n<li class=\"nav-item d-inline-block d-lg-none\">\n<a title=\"Search\" aria-label=\"Search\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" href=\"/search?project_id=9240988\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n</a></li>\n<li class=\"nav-item header-help dropdown d-none d-md-block\">\n<a class=\"header-help-dropdown-toggle\" data-toggle=\"dropdown\" href=\"/help\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#question\"></use></svg>\n<svg class=\"caret-down\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-down\"></use></svg>\n</a><div class=\"dropdown-menu dropdown-menu-right\">\n<ul>\n<li>\n<a href=\"/help\">Help</a>\n</li>\n<li>\n<a href=\"https://about.gitlab.com/getting-help/\">Support</a>\n</li>\n\n<li class=\"divider\"></li>\n<li>\n<a href=\"https://about.gitlab.com/submit-feedback\">Submit feedback</a>\n</li>\n<li>\n<a target=\"_blank\" class=\"text-nowrap\" href=\"https://about.gitlab.com/contributing\">Contribute to GitLab\n</a>\n\n</li>\n\n<li>\n<a href=\"https://next.gitlab.com/\">Switch to GitLab Next</a>\n</li>\n</ul>\n\n</div>\n</li>\n<li class=\"nav-item\">\n<div>\n<a class=\"btn btn-sign-in\" href=\"/users/sign_in?redirect_to_referer=yes\">Sign in / Register</a>\n</div>\n</li>\n</ul>\n</div>\n<button class=\"navbar-toggler d-block d-sm-none\" type=\"button\">\n<span class=\"sr-only\">Toggle navigation</span>\n<svg class=\"s12 more-icon js-navbar-toggle-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#ellipsis_h\"></use></svg>\n<svg class=\"s12 close-icon js-navbar-toggle-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</button>\n</div>\n</div>\n</header>\n\n<div class=\"layout-page page-with-contextual-sidebar\">\n<div class=\"nav-sidebar\">\n<div class=\"nav-sidebar-inner-scroll\">\n<div class=\"context-header\">\n<a title=\"strutil\" href=\"/cznic/strutil\"><div class=\"avatar-container rect-avatar s40 project-avatar\">\n<div class=\"avatar s40 avatar-tile identicon bg2\">S</div>\n</div>\n<div class=\"sidebar-context-title\">\nstrutil\n</div>\n</a></div>\n<ul class=\"sidebar-top-level-items\">\n<li class=\"home\"><a class=\"shortcuts-project rspec-project-link\" data-qa-selector=\"project_link\" href=\"/cznic/strutil\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#home\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nProject overview\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil\"><strong class=\"fly-out-top-item-name\">\nProject overview\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Project details\" class=\"shortcuts-project\" href=\"/cznic/strutil\"><span>Details</span>\n</a></li><li class=\"\"><a title=\"Activity\" class=\"shortcuts-project-activity\" data-qa-selector=\"activity_link\" href=\"/cznic/strutil/activity\"><span>Activity</span>\n</a></li><li class=\"\"><a title=\"Releases\" class=\"shortcuts-project-releases\" href=\"/cznic/strutil/-/releases\"><span>Releases</span>\n</a></li><li class=\"\"><a title=\"Cycle Analytics\" class=\"shortcuts-project-cycle-analytics\" href=\"/cznic/strutil/-/cycle_analytics\"><span>Cycle Analytics</span>\n</a></li><li class=\"\"><a title=\"Insights\" class=\"shortcuts-project-insights\" data-qa-selector=\"project_insights_link\" href=\"/cznic/strutil/insights/\"><span>Insights</span>\n</a></li>\n</ul>\n</li><li class=\"active\"><a class=\"shortcuts-tree qa-project-menu-repo\" href=\"/cznic/strutil/tree/master\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-text\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-repo-link\">\nRepository\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item active\"><a href=\"/cznic/strutil/tree/master\"><strong class=\"fly-out-top-item-name\">\nRepository\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"active\"><a href=\"/cznic/strutil/tree/master\">Files\n</a></li><li class=\"\"><a id=\"js-onboarding-commits-link\" href=\"/cznic/strutil/commits/master\">Commits\n</a></li><li class=\"\"><a class=\"qa-branches-link\" id=\"js-onboarding-branches-link\" href=\"/cznic/strutil/-/branches\">Branches\n</a></li><li class=\"\"><a href=\"/cznic/strutil/-/tags\">Tags\n</a></li><li class=\"\"><a href=\"/cznic/strutil/-/graphs/master\">Contributors\n</a></li><li class=\"\"><a href=\"/cznic/strutil/-/network/master\">Graph\n</a></li><li class=\"\"><a href=\"/cznic/strutil/compare?from=master&amp;to=master\">Compare\n</a></li><li class=\"\"><a href=\"/cznic/strutil/-/graphs/master/charts\">Charts\n</a></li><li class=\"\"><a data-qa-selector=\"path_locks_link\" href=\"/cznic/strutil/path_locks\">Locked Files\n</a></li>\n</ul>\n</li><li class=\"\"><a class=\"shortcuts-issues qa-issues-item\" href=\"/cznic/strutil/issues\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#issues\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-issues-link\">\nIssues\n</span>\n<span class=\"badge badge-pill count issue_counter\">\n0\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/issues\"><strong class=\"fly-out-top-item-name\">\nIssues\n</strong>\n<span class=\"badge badge-pill count issue_counter fly-out-badge\">\n0\n</span>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Issues\" href=\"/cznic/strutil/issues\"><span>\nList\n</span>\n</a></li><li class=\"\"><a title=\"Boards\" data-qa-selector=\"issue_boards_link\" href=\"/cznic/strutil/-/boards\"><span>\nBoards\n</span>\n</a></li><li class=\"\"><a title=\"Labels\" class=\"qa-labels-link\" href=\"/cznic/strutil/-/labels\"><span>\nLabels\n</span>\n</a></li><li class=\"\"><a title=\"Service Desk\" href=\"/cznic/strutil/issues/service_desk\">Service Desk\n</a></li>\n<li class=\"\"><a title=\"Milestones\" class=\"qa-milestones-link\" href=\"/cznic/strutil/-/milestones\"><span>\nMilestones\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-merge_requests\" data-qa-selector=\"merge_requests_link\" href=\"/cznic/strutil/merge_requests\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#git-merge\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-mr-link\">\nMerge Requests\n</span>\n<span class=\"badge badge-pill count merge_counter js-merge-counter\">\n0\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/merge_requests\"><strong class=\"fly-out-top-item-name\">\nMerge Requests\n</strong>\n<span class=\"badge badge-pill count merge_counter js-merge-counter fly-out-badge\">\n0\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-pipelines qa-link-pipelines rspec-link-pipelines\" data-qa-selector=\"ci_cd_link\" href=\"/cznic/strutil/pipelines\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#rocket\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-pipelines-link\">\nCI / CD\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/pipelines\"><strong class=\"fly-out-top-item-name\">\nCI / CD\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Pipelines\" class=\"shortcuts-pipelines\" href=\"/cznic/strutil/pipelines\"><span>\nPipelines\n</span>\n</a></li><li class=\"\"><a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/strutil/-/jobs\"><span>\nJobs\n</span>\n</a></li><li class=\"\"><a title=\"Schedules\" class=\"shortcuts-builds\" href=\"/cznic/strutil/pipeline_schedules\"><span>\nSchedules\n</span>\n</a></li><li class=\"\"><a title=\"Charts\" class=\"shortcuts-pipelines-charts\" href=\"/cznic/strutil/pipelines/charts\"><span>\nCharts\n</span>\n</a></li></ul>\n</li><li class=\"\"><a data-qa-selector=\"dependency_list_link\" href=\"/cznic/strutil/dependencies\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#shield\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSecurity &amp; Compliance\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/dependencies\"><strong class=\"fly-out-top-item-name\">\nSecurity &amp; Compliance\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Dependency List\" data-qa-selector=\"dependency_list_link\" href=\"/cznic/strutil/dependencies\"><span>Dependency List</span>\n</a></li><li class=\"\"><a title=\"License Compliance\" data-qa-selector=\"licenses_list_link\" href=\"/cznic/strutil/-/licenses\"><span>License Compliance</span>\n</a></li></ul>\n</li>\n<li class=\"\"><a data-qa-selector=\"packages_link\" href=\"/cznic/strutil/-/packages\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#package\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nPackages\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/-/packages\"><strong class=\"fly-out-top-item-name\">\nPackages\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Packages\" href=\"/cznic/strutil/-/packages\"><span>List</span>\n</a></li><li class=\"\"><a class=\"shortcuts-container-registry\" title=\"Container Registry\" href=\"/cznic/strutil/container_registry\"><span>Container Registry</span>\n</a></li></ul>\n</li>\n\n<li class=\"\"><a class=\"shortcuts-wiki\" data-qa-selector=\"wiki_link\" href=\"/cznic/strutil/-/wikis/home\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#book\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nWiki\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/-/wikis/home\"><strong class=\"fly-out-top-item-name\">\nWiki\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-snippets\" href=\"/cznic/strutil/snippets\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#snippet\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSnippets\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/snippets\"><strong class=\"fly-out-top-item-name\">\nSnippets\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a title=\"Members\" class=\"shortcuts-tree\" href=\"/cznic/strutil/-/settings/members\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#users\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nMembers\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/strutil/-/project_members\"><strong class=\"fly-out-top-item-name\">\nMembers\n</strong>\n</a></li></ul>\n</li><a class=\"toggle-sidebar-button js-toggle-sidebar qa-toggle-sidebar rspec-toggle-sidebar\" role=\"button\" title=\"Toggle sidebar\" type=\"button\">\n<svg class=\"icon-angle-double-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-left\"></use></svg>\n<svg class=\"icon-angle-double-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-right\"></use></svg>\n<span class=\"collapse-text\">Collapse sidebar</span>\n</a>\n<button name=\"button\" type=\"button\" class=\"close-nav-button\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n<span class=\"collapse-text\">Close sidebar</span>\n</button>\n<li class=\"hidden\">\n<a title=\"Activity\" class=\"shortcuts-project-activity\" href=\"/cznic/strutil/activity\"><span>\nActivity\n</span>\n</a></li>\n<li class=\"hidden\">\n<a title=\"Network\" class=\"shortcuts-network\" href=\"/cznic/strutil/-/network/master\">Graph\n</a></li>\n<li class=\"hidden\">\n<a title=\"Charts\" class=\"shortcuts-repository-charts\" href=\"/cznic/strutil/-/graphs/master/charts\">Charts\n</a></li>\n<li class=\"hidden\">\n<a class=\"shortcuts-new-issue\" href=\"/cznic/strutil/issues/new\">Create a new issue\n</a></li>\n<li class=\"hidden\">\n<a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/strutil/-/jobs\">Jobs\n</a></li>\n<li class=\"hidden\">\n<a title=\"Commits\" class=\"shortcuts-commits\" href=\"/cznic/strutil/commits/master\">Commits\n</a></li>\n<li class=\"hidden\">\n<a title=\"Issue Boards\" class=\"shortcuts-issue-boards\" href=\"/cznic/strutil/-/boards\">Issue Boards</a>\n</li>\n</ul>\n</div>\n</div>\n\n<div class=\"content-wrapper\">\n\n<div class=\"mobile-overlay\"></div>\n<div class=\"alert-wrapper\">\n\n\n\n\n\n\n<nav class=\"breadcrumbs container-fluid container-limited\" role=\"navigation\">\n<div class=\"breadcrumbs-container\">\n<button name=\"button\" type=\"button\" class=\"toggle-mobile-nav\"><span class=\"sr-only\">Open sidebar</span>\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-bars\"></i>\n</button><div class=\"breadcrumbs-links js-title-container\">\n<ul class=\"list-unstyled breadcrumbs-list js-breadcrumbs-list\">\n<li><a href=\"/cznic\">cznic</a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li> <li><a href=\"/cznic/strutil\"><span class=\"breadcrumb-item-text js-breadcrumb-item-text\">strutil</span></a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li>\n\n<li>\n<h2 class=\"breadcrumbs-sub-title\"><a href=\"/cznic/strutil/blob/master/LICENSE\">Repository</a></h2>\n</li>\n</ul>\n</div>\n\n</div>\n</nav>\n\n<div class=\"d-flex\"></div>\n</div>\n<div class=\"container-fluid container-limited \">\n<div class=\"content\" id=\"content-body\">\n<div class=\"flash-container flash-container-page sticky\">\n</div>\n\n<div class=\"js-signature-container\" data-signatures-path=\"/cznic/strutil/commits/2612795415cf6f9e4e25a3035f36d6c17c4974a8/signatures?limit=1\"></div>\n\n<div class=\"tree-holder\" id=\"tree-holder\">\n<div class=\"nav-block\">\n<div class=\"tree-ref-container\">\n<div class=\"tree-ref-holder\">\n<form class=\"project-refs-form\" action=\"/cznic/strutil/refs/switch\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"destination\" id=\"destination\" value=\"blob\" />\n<input type=\"hidden\" name=\"path\" id=\"path\" value=\"LICENSE\" />\n<div class=\"dropdown\">\n<button class=\"dropdown-menu-toggle js-project-refs-dropdown qa-branches-select\" type=\"button\" data-toggle=\"dropdown\" data-selected=\"master\" data-ref=\"master\" data-refs-url=\"/cznic/strutil/refs?sort=updated_desc\" data-field-name=\"ref\" data-submit-form-on-click=\"true\" data-visit=\"true\"><span class=\"dropdown-toggle-text \">master</span><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-chevron-down\"></i></button>\n<div class=\"dropdown-menu dropdown-menu-paging dropdown-menu-selectable git-revision-dropdown qa-branches-dropdown\">\n<div class=\"dropdown-page-one\">\n<div class=\"dropdown-title\"><span>Switch branch/tag</span><button class=\"dropdown-title-button dropdown-menu-close\" aria-label=\"Close\" type=\"button\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-times dropdown-menu-close-icon\"></i></button></div>\n<div class=\"dropdown-input\"><input type=\"search\" id=\"\" class=\"dropdown-input-field qa-dropdown-input-field\" placeholder=\"Search branches and tags\" autocomplete=\"off\" /><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search dropdown-input-search\"></i><i aria-hidden=\"true\" data-hidden=\"true\" role=\"button\" class=\"fa fa-times dropdown-input-clear js-dropdown-input-clear\"></i></div>\n<div class=\"dropdown-content\"></div>\n<div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n</div>\n</div>\n</form>\n</div>\n<ul class=\"breadcrumb repo-breadcrumb\">\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/strutil/tree/master\">strutil\n</a></li>\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/strutil/blob/master/LICENSE\"><strong>LICENSE</strong>\n</a></li>\n</ul>\n</div>\n<div class=\"tree-controls\"><a class=\"btn shortcuts-find-file\" rel=\"nofollow\" href=\"/cznic/strutil/find_file/master\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search\"></i>\n<span>Find file</span>\n</a><a class=\"btn js-blob-blame-link\" href=\"/cznic/strutil/blame/master/LICENSE\">Blame</a><a class=\"btn\" href=\"/cznic/strutil/commits/master/LICENSE\">History</a><a class=\"btn js-data-file-blob-permalink-url\" href=\"/cznic/strutil/blob/9654ad6deeb404d1ca68c1d66d008bbaf3e2c50e/LICENSE\">Permalink</a></div>\n</div>\n\n<div class=\"info-well d-none d-sm-block\">\n<div class=\"well-segment\">\n<ul class=\"blob-commit-info\">\n<li class=\"commit flex-row js-toggle-container\" id=\"commit-26127954\">\n<div class=\"avatar-cell d-none d-sm-block\">\n<a href=\"/cznic\"><img alt=\"cznic&#39;s avatar\" src=\"/uploads/-/system/user/avatar/2447325/avatar.png?width=40\" class=\"avatar s40 d-none d-sm-inline-block\" title=\"cznic\" /></a>\n</div>\n<div class=\"commit-detail flex-list\">\n<div class=\"commit-content qa-commit-content\">\n<a class=\"commit-row-message item-title js-onboarding-commit-item\" href=\"/cznic/strutil/commit/2612795415cf6f9e4e25a3035f36d6c17c4974a8\">A+C</a>\n<span class=\"commit-row-message d-inline d-sm-none\">\n&middot;\n26127954\n</span>\n<div class=\"committer\">\n<a class=\"commit-author-link js-user-link\" data-user-id=\"2447325\" href=\"/cznic\">cznic</a> authored <time class=\"js-timeago\" title=\"Aug 18, 2014 12:27pm\" datetime=\"2014-08-18T12:27:56Z\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\">Aug 18, 2014</time>\n</div>\n\n</div>\n<div class=\"commit-actions flex-row\">\n\n<div class=\"js-commit-pipeline-status\" data-endpoint=\"/cznic/strutil/commit/2612795415cf6f9e4e25a3035f36d6c17c4974a8/pipelines?ref=master\"></div>\n<div class=\"commit-sha-group d-none d-sm-flex\">\n<div class=\"label label-monospace monospace\">\n26127954\n</div>\n<button class=\"btn btn btn-default\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-title=\"Copy commit SHA\" data-class=\"btn btn-default\" data-clipboard-text=\"2612795415cf6f9e4e25a3035f36d6c17c4974a8\" type=\"button\" title=\"Copy commit SHA\" aria-label=\"Copy commit SHA\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n\n</div>\n</div>\n</div>\n</li>\n\n</ul>\n</div>\n\n<div class=\"well-segment blob-auxiliary-viewer\">\n<div class=\"blob-viewer\" data-type=\"auxiliary\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-balance-scale fa-fw\"></i>\nThis project is licensed under the\n<strong>BSD 3-clause &quot;New&quot; or &quot;Revised&quot; License</strong>.\n<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://choosealicense.com/licenses/bsd-3-clause/\">Learn more</a>\n\n</div>\n\n</div>\n\n</div>\n<div class=\"blob-content-holder\" id=\"blob-content-holder\">\n<article class=\"file-holder\">\n<div class=\"js-file-title file-title-flex-parent\">\n<div class=\"file-header-content\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-file-text-o fa-fw\"></i>\n<strong class=\"file-title-name qa-file-title-name\">\nLICENSE\n</strong>\n<button class=\"btn btn-clipboard btn-transparent\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn-clipboard btn-transparent\" data-title=\"Copy file path\" data-clipboard-text=\"{&quot;text&quot;:&quot;LICENSE&quot;,&quot;gfm&quot;:&quot;`LICENSE`&quot;}\" type=\"button\" title=\"Copy file path\" aria-label=\"Copy file path\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n<small class=\"mr-1\">\n1.45 KB\n</small>\n</div>\n\n<div class=\"file-actions\">\n\n<div class=\"btn-group\" role=\"group\"><a class=\"btn btn-primary js-edit-blob  btn-sm\" href=\"/cznic/strutil/edit/master/LICENSE\">Edit</a><a class=\"btn btn-inverted btn-primary ide-edit-button btn-sm\" href=\"/-/ide/project/cznic/strutil/edit/master/-/LICENSE\">Web IDE</a></div>\n<div class=\"btn-group\" role=\"group\">\n</div>\n<div class=\"btn-group\" role=\"group\"><button class=\"btn btn btn-sm js-copy-blob-source-btn\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn btn-sm js-copy-blob-source-btn\" data-title=\"Copy file contents\" data-clipboard-target=\".blob-content[data-blob-id=&#39;2fdd92cf71397b10c54e5ca8b625311695ea909e&#39;]\" type=\"button\" title=\"Copy file contents\" aria-label=\"Copy file contents\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button><a class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open raw\" title=\"Open raw\" data-container=\"body\" href=\"/cznic/strutil/raw/master/LICENSE\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-code\"></use></svg></a><a download=\"LICENSE\" class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Download\" title=\"Download\" data-container=\"body\" href=\"/cznic/strutil/raw/master/LICENSE?inline=false\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#download\"></use></svg></a></div>\n</div>\n</div>\n\n<script id=\"js-file-lock\" type=\"application/json\">\n{\"path\":\"LICENSE\",\"toggle_path\":\"/cznic/strutil/path_locks/toggle\"}\n</script>\n\n\n<div class=\"blob-viewer\" data-type=\"simple\" data-url=\"/cznic/strutil/blob/master/LICENSE?format=json&amp;viewer=simple\">\n<div class=\"text-center prepend-top-default append-bottom-default\">\n<i aria-hidden=\"true\" aria-label=\"Loading content…\" class=\"fa fa-spinner fa-spin fa-2x qa-spinner\"></i>\n</div>\n\n</div>\n\n\n</article>\n</div>\n\n<div class=\"modal\" id=\"modal-upload-blob\">\n<div class=\"modal-dialog modal-lg\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3 class=\"page-title\">Replace LICENSE</h3>\n<button aria-label=\"Close\" class=\"close\" data-dismiss=\"modal\" type=\"button\">\n<span aria-hidden>&times;</span>\n</button>\n</div>\n<div class=\"modal-body\">\n<form class=\"js-quick-submit js-upload-blob-form\" data-method=\"put\" action=\"/cznic/strutil/update/master/LICENSE\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"_method\" value=\"put\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"1FdpWp/mJC4IWugFFuuuXqLtdx+YlqVCsdSKaYSBapbYLeqUDdY3hFQtgYI0VHEDZ0jszt9YyyXrL+GGHPN2Pg==\" /><div class=\"dropzone\">\n<div class=\"dropzone-previews blob-upload-dropzone-previews\">\n<p class=\"dz-message light\">\nAttach a file by drag &amp; drop or <a class=\"markdown-selector\" href=\"#\">click to upload</a>\n</p>\n</div>\n</div>\n<br>\n<div class=\"dropzone-alerts alert alert-danger data\" style=\"display:none\"></div>\n<div class=\"form-group row commit_message-group\">\n<label class=\"col-form-label col-sm-2\" for=\"commit_message-23ee3cfa46d05f75319a946a672d6832\">Commit message\n</label><div class=\"col-sm-10\">\n<div class=\"commit-message-container\">\n<div class=\"max-width-marker\"></div>\n<textarea name=\"commit_message\" id=\"commit_message-23ee3cfa46d05f75319a946a672d6832\" class=\"form-control js-commit-message\" placeholder=\"Replace LICENSE\" required=\"required\" rows=\"3\">\nReplace LICENSE</textarea>\n</div>\n</div>\n</div>\n\n<input type=\"hidden\" name=\"branch_name\" id=\"branch_name\" />\n<input type=\"hidden\" name=\"create_merge_request\" id=\"create_merge_request\" value=\"1\" />\n<input type=\"hidden\" name=\"original_branch\" id=\"original_branch\" value=\"master\" class=\"js-original-branch\" />\n\n<div class=\"form-actions\">\n<button name=\"button\" type=\"button\" class=\"btn btn-success btn-upload-file\" id=\"submit-all\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spin fa-spinner js-loading-icon hidden\"></i>\nReplace file\n</button><a class=\"btn btn-cancel\" data-dismiss=\"modal\" href=\"#\">Cancel</a>\n<div class=\"inline prepend-left-10\">\nA new branch will be created in your fork and a new merge request will be started.\n</div>\n\n</div>\n</form></div>\n</div>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n</div>\n</div>\n\n\n\n\n</body>\n</html>\n\n\n--------------------------------------------------------------------------------\nmodernc.org/xc  BSD 3-Clause \"New\" or \"Revised\" License  https://gitlab.com/cznic/xc/blob/master/LICENSE\n--------------------------------------------------------------------------------\n<!DOCTYPE html>\n<html class=\"\" lang=\"en\">\n<head prefix=\"og: http://ogp.me/ns#\">\n<meta charset=\"utf-8\">\n<link href=\"https://assets.gitlab-static.net\" rel=\"dns-prefetch\">\n<link crossorigin=\"\" href=\"https://assets.gitlab-static.net\" rel=\"preconnnect\">\n<meta content=\"IE=edge\" http-equiv=\"X-UA-Compatible\">\n<meta content=\"object\" property=\"og:type\">\n<meta content=\"GitLab\" property=\"og:site_name\">\n<meta content=\"LICENSE · master · cznic / xc\" property=\"og:title\">\n<meta content=\"Package xc provides cross language compiler support/utility stuff.\" property=\"og:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"og:image\">\n<meta content=\"64\" property=\"og:image:width\">\n<meta content=\"64\" property=\"og:image:height\">\n<meta content=\"https://gitlab.com/cznic/xc/blob/master/LICENSE\" property=\"og:url\">\n<meta content=\"summary\" property=\"twitter:card\">\n<meta content=\"LICENSE · master · cznic / xc\" property=\"twitter:title\">\n<meta content=\"Package xc provides cross language compiler support/utility stuff.\" property=\"twitter:description\">\n<meta content=\"https://assets.gitlab-static.net/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png\" property=\"twitter:image\">\n\n<title>LICENSE · master · cznic / xc · GitLab</title>\n<meta content=\"Package xc provides cross language compiler support/utility stuff.\" name=\"description\">\n<link rel=\"shortcut icon\" type=\"image/png\" href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" id=\"favicon\" data-original-href=\"https://gitlab.com/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png\" />\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/application-a6e08192483b8e7eefdaa5a17246c14776ebd30ccf14cf9510edaed797b7fb2d.css\" />\n<link rel=\"stylesheet\" media=\"print\" href=\"https://assets.gitlab-static.net/assets/print-74c3df10dad473d66660c828e3aa54ca3bfeac6d8bb708643331403fe7211e60.css\" />\n\n\n<link rel=\"stylesheet\" media=\"all\" href=\"https://assets.gitlab-static.net/assets/highlight/themes/white-3144068cf4f603d290f553b653926358ddcd02493b9728f62417682657fc58c0.css\" />\n<script nonce=\"bL0EQeIV1Qiji8vOoW8azQ==\">\n//<![CDATA[\nwindow.gon={};\n//]]>\n</script>\n\n<script src=\"https://assets.gitlab-static.net/assets/webpack/runtime.e17b7ae7.bundle.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/main.75a7b9a1.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/sentry.281a8c95.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.admin.clusters~pages.admin.clusters.destroy~pages.admin.clusters.edit~pages.admin.clus~1ba693ac.ea1d3193.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/commons~pages.groups.epics.index~pages.groups.epics.show~pages.groups.milestones.edit~pages.groups.m~b7d7bc7f.bec192ac.chunk.js\" defer=\"defer\"></script>\n<script src=\"https://assets.gitlab-static.net/assets/webpack/pages.projects.blob.show.86ee57df.chunk.js\" defer=\"defer\"></script>\n\n<meta name=\"csrf-param\" content=\"authenticity_token\" />\n<meta name=\"csrf-token\" content=\"RYlHWM6ysaHgRWy0I15nkbsl0Gqpfa6bJvDVKz6O9e4YXCEBp5H97Gci/EK83UfUokrNq+2YyT/Z6E5A/OYo4w==\" />\n<meta name=\"csp-nonce\" content=\"bL0EQeIV1Qiji8vOoW8azQ==\" />\n<meta content=\"origin-when-cross-origin\" name=\"referrer\">\n<meta content=\"width=device-width, initial-scale=1, maximum-scale=1\" name=\"viewport\">\n<meta content=\"#474D57\" name=\"theme-color\">\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-5a9cee0e8a51212e70b90c87c12f382c428870c0ff67d1eb034d884b78d2dae7.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-a6eec6aeb9da138e507593b464fdac213047e49d3093fc30e90d9a995df83ba3.png\" sizes=\"76x76\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-iphone-retina-72e2aadf86513a56e050e7f0f2355deaa19cc17ed97bbe5147847f2748e5a3e3.png\" sizes=\"120x120\" />\n<link rel=\"apple-touch-icon\" type=\"image/x-icon\" href=\"https://assets.gitlab-static.net/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png\" sizes=\"152x152\" />\n<link color=\"rgb(226, 67, 41)\" href=\"https://assets.gitlab-static.net/assets/logo-d36b5212042cebc89b96df4bf6ac24e43db316143e89926c0db839ff694d2de4.svg\" rel=\"mask-icon\">\n<meta content=\"https://assets.gitlab-static.net/assets/msapplication-tile-1196ec67452f618d39cdd85e2e3a542f76574c071051ae7effbfde01710eb17d.png\" name=\"msapplication-TileImage\">\n<meta content=\"#30353E\" name=\"msapplication-TileColor\">\n\n\n\n<script nonce=\"bL0EQeIV1Qiji8vOoW8azQ==\">\n//<![CDATA[\n;(function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalSnowplowNamespace=p.GlobalSnowplowNamespace||[];\np.GlobalSnowplowNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)\n};p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;\nn.src=w;g.parentNode.insertBefore(n,g)}}(window,document,\"script\",\"https://assets.gitlab-static.net/assets/snowplow/sp-e10fd598642f1a4dd3e9e0e026f6a1ffa3c31b8a40efd92db3f92d32873baed6.js\",\"snowplow\"));\n\nwindow.snowplowOptions = {\"namespace\":\"gl\",\"hostname\":\"snowplow.trx.gitlab.net\",\"cookieDomain\":\".gitlab.com\",\"appId\":\"gitlab\",\"formTracking\":true,\"linkClickTracking\":true,\"igluRegistryUrl\":null}\n\n\n//]]>\n</script>\n</head>\n\n<body class=\"ui-indigo  gl-browser-generic gl-platform-other\" data-find-file=\"/cznic/xc/find_file/master\" data-group=\"\" data-namespace-id=\"3055233\" data-page=\"projects:blob:show\" data-page-type-id=\"master/LICENSE\" data-project=\"xc\" data-project-id=\"9241005\">\n\n<script nonce=\"bL0EQeIV1Qiji8vOoW8azQ==\">\n//<![CDATA[\ngl = window.gl || {};\ngl.client = {\"isGeneric\":true,\"isOther\":true};\n\n\n//]]>\n</script>\n\n\n<header class=\"navbar navbar-gitlab navbar-expand-sm js-navbar\" data-qa-selector=\"navbar\">\n<a class=\"sr-only gl-accessibility\" href=\"#content-body\" tabindex=\"1\">Skip to content</a>\n<div class=\"container-fluid\">\n<div class=\"header-content\">\n<div class=\"title-container\">\n<h1 class=\"title\">\n<a title=\"Dashboard\" id=\"logo\" href=\"/\"><svg width=\"24\" height=\"24\" class=\"tanuki-logo\" viewBox=\"0 0 36 36\">\n  <path class=\"tanuki-shape tanuki-left-ear\" fill=\"#e24329\" d=\"M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-right-ear\" fill=\"#e24329\" d=\"M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z\"/>\n  <path class=\"tanuki-shape tanuki-nose\" fill=\"#e24329\" d=\"M18,34.38 3,14 33,14 Z\"/>\n  <path class=\"tanuki-shape tanuki-left-eye\" fill=\"#fc6d26\" d=\"M18,34.38 11.38,14 2,14 6,25Z\"/>\n  <path class=\"tanuki-shape tanuki-right-eye\" fill=\"#fc6d26\" d=\"M18,34.38 24.62,14 34,14 30,25Z\"/>\n  <path class=\"tanuki-shape tanuki-left-cheek\" fill=\"#fca326\" d=\"M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z\"/>\n  <path class=\"tanuki-shape tanuki-right-cheek\" fill=\"#fca326\" d=\"M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z\"/>\n</svg>\n\n<span class=\"logo-text d-none d-lg-block prepend-left-8\">\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 617 169\"><path d=\"M315.26 2.97h-21.8l.1 162.5h88.3v-20.1h-66.5l-.1-142.4M465.89 136.95c-5.5 5.7-14.6 11.4-27 11.4-16.6 0-23.3-8.2-23.3-18.9 0-16.1 11.2-23.8 35-23.8 4.5 0 11.7.5 15.4 1.2v30.1h-.1m-22.6-98.5c-17.6 0-33.8 6.2-46.4 16.7l7.7 13.4c8.9-5.2 19.8-10.4 35.5-10.4 17.9 0 25.8 9.2 25.8 24.6v7.9c-3.5-.7-10.7-1.2-15.1-1.2-38.2 0-57.6 13.4-57.6 41.4 0 25.1 15.4 37.7 38.7 37.7 15.7 0 30.8-7.2 36-18.9l4 15.9h15.4v-83.2c-.1-26.3-11.5-43.9-44-43.9M557.63 149.1c-8.2 0-15.4-1-20.8-3.5V70.5c7.4-6.2 16.6-10.7 28.3-10.7 21.1 0 29.2 14.9 29.2 39 0 34.2-13.1 50.3-36.7 50.3m9.2-110.6c-19.5 0-30 13.3-30 13.3v-21l-.1-27.8h-21.3l.1 158.5c10.7 4.5 25.3 6.9 41.2 6.9 40.7 0 60.3-26 60.3-70.9-.1-35.5-18.2-59-50.2-59M77.9 20.6c19.3 0 31.8 6.4 39.9 12.9l9.4-16.3C114.5 6 97.3 0 78.9 0 32.5 0 0 28.3 0 85.4c0 59.8 35.1 83.1 75.2 83.1 20.1 0 37.2-4.7 48.4-9.4l-.5-63.9V75.1H63.6v20.1h38l.5 48.5c-5 2.5-13.6 4.5-25.3 4.5-32.2 0-53.8-20.3-53.8-63-.1-43.5 22.2-64.6 54.9-64.6M231.43 2.95h-21.3l.1 27.3v94.3c0 26.3 11.4 43.9 43.9 43.9 4.5 0 8.9-.4 13.1-1.2v-19.1c-3.1.5-6.4.7-9.9.7-17.9 0-25.8-9.2-25.8-24.6v-65h35.7v-17.8h-35.7l-.1-38.5M155.96 165.47h21.3v-124h-21.3v124M155.96 24.37h21.3V3.07h-21.3v21.3\"/></svg>\n\n</span>\n</a></h1>\n<ul class=\"list-unstyled navbar-sub-nav\">\n<li class=\"home\"><a title=\"Projects\" class=\"dashboard-shortcuts-projects\" href=\"/explore\">Projects\n</a></li><li class=\"\"><a title=\"Groups\" class=\"dashboard-shortcuts-groups\" href=\"/explore/groups\">Groups\n</a></li><li class=\"\"><a title=\"Snippets\" class=\"dashboard-shortcuts-snippets\" href=\"/explore/snippets\">Snippets\n</a></li><li>\n<a title=\"About GitLab CE\" href=\"/help\">Help</a>\n</li>\n</ul>\n\n</div>\n<div class=\"navbar-collapse collapse\">\n<ul class=\"nav navbar-nav\">\n<li class=\"nav-item d-none d-lg-block m-auto\">\n<div class=\"search search-form\" data-track-event=\"activate_form_input\" data-track-label=\"navbar_search\" data-track-value=\"\">\n<form class=\"form-inline\" action=\"/search\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><div class=\"search-input-container\">\n<div class=\"search-input-wrap\">\n<div class=\"dropdown\" data-url=\"/search/autocomplete\">\n<input type=\"search\" name=\"search\" id=\"search\" placeholder=\"Search or jump to…\" class=\"search-input dropdown-menu-toggle no-outline js-search-dashboard-options\" spellcheck=\"false\" tabindex=\"1\" autocomplete=\"off\" data-issues-path=\"/dashboard/issues\" data-mr-path=\"/dashboard/merge_requests\" data-qa-selector=\"search_term_field\" aria-label=\"Search or jump to…\" />\n<button class=\"hidden js-dropdown-search-toggle\" data-toggle=\"dropdown\" type=\"button\"></button>\n<div class=\"dropdown-menu dropdown-select js-dashboard-search-options\">\n<div class=\"dropdown-content\"><ul>\n<li class=\"dropdown-menu-empty-item\">\n<a>\nLoading...\n</a>\n</li>\n</ul>\n</div><div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n<svg class=\"s16 search-icon\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n<svg class=\"s16 clear-icon js-clear-input\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</div>\n</div>\n</div>\n<input type=\"hidden\" name=\"group_id\" id=\"group_id\" class=\"js-search-group-options\" />\n<input type=\"hidden\" name=\"project_id\" id=\"search_project_id\" value=\"9241005\" class=\"js-search-project-options\" data-project-path=\"xc\" data-name=\"xc\" data-issues-path=\"/cznic/xc/issues\" data-mr-path=\"/cznic/xc/merge_requests\" data-issues-disabled=\"false\" />\n<input type=\"hidden\" name=\"search_code\" id=\"search_code\" value=\"true\" />\n<input type=\"hidden\" name=\"repository_ref\" id=\"repository_ref\" value=\"master\" />\n<input type=\"hidden\" name=\"nav_source\" id=\"nav_source\" value=\"navbar\" />\n<div class=\"search-autocomplete-opts hide\" data-autocomplete-path=\"/search/autocomplete\" data-autocomplete-project-id=\"9241005\" data-autocomplete-project-ref=\"master\"></div>\n</form></div>\n\n</li>\n<li class=\"nav-item d-inline-block d-lg-none\">\n<a title=\"Search\" aria-label=\"Search\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" href=\"/search?project_id=9241005\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#search\"></use></svg>\n</a></li>\n<li class=\"nav-item header-help dropdown d-none d-md-block\">\n<a class=\"header-help-dropdown-toggle\" data-toggle=\"dropdown\" href=\"/help\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#question\"></use></svg>\n<svg class=\"caret-down\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-down\"></use></svg>\n</a><div class=\"dropdown-menu dropdown-menu-right\">\n<ul>\n<li>\n<a href=\"/help\">Help</a>\n</li>\n<li>\n<a href=\"https://about.gitlab.com/getting-help/\">Support</a>\n</li>\n\n<li class=\"divider\"></li>\n<li>\n<a href=\"https://about.gitlab.com/submit-feedback\">Submit feedback</a>\n</li>\n<li>\n<a target=\"_blank\" class=\"text-nowrap\" href=\"https://about.gitlab.com/contributing\">Contribute to GitLab\n</a>\n\n</li>\n\n<li>\n<a href=\"https://next.gitlab.com/\">Switch to GitLab Next</a>\n</li>\n</ul>\n\n</div>\n</li>\n<li class=\"nav-item\">\n<div>\n<a class=\"btn btn-sign-in\" href=\"/users/sign_in?redirect_to_referer=yes\">Sign in / Register</a>\n</div>\n</li>\n</ul>\n</div>\n<button class=\"navbar-toggler d-block d-sm-none\" type=\"button\">\n<span class=\"sr-only\">Toggle navigation</span>\n<svg class=\"s12 more-icon js-navbar-toggle-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#ellipsis_h\"></use></svg>\n<svg class=\"s12 close-icon js-navbar-toggle-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n</button>\n</div>\n</div>\n</header>\n\n<div class=\"layout-page page-with-contextual-sidebar\">\n<div class=\"nav-sidebar\">\n<div class=\"nav-sidebar-inner-scroll\">\n<div class=\"context-header\">\n<a title=\"xc\" href=\"/cznic/xc\"><div class=\"avatar-container rect-avatar s40 project-avatar\">\n<div class=\"avatar s40 avatar-tile identicon bg5\">X</div>\n</div>\n<div class=\"sidebar-context-title\">\nxc\n</div>\n</a></div>\n<ul class=\"sidebar-top-level-items\">\n<li class=\"home\"><a class=\"shortcuts-project rspec-project-link\" data-qa-selector=\"project_link\" href=\"/cznic/xc\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#home\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nProject overview\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc\"><strong class=\"fly-out-top-item-name\">\nProject overview\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Project details\" class=\"shortcuts-project\" href=\"/cznic/xc\"><span>Details</span>\n</a></li><li class=\"\"><a title=\"Activity\" class=\"shortcuts-project-activity\" data-qa-selector=\"activity_link\" href=\"/cznic/xc/activity\"><span>Activity</span>\n</a></li><li class=\"\"><a title=\"Releases\" class=\"shortcuts-project-releases\" href=\"/cznic/xc/-/releases\"><span>Releases</span>\n</a></li><li class=\"\"><a title=\"Cycle Analytics\" class=\"shortcuts-project-cycle-analytics\" href=\"/cznic/xc/-/cycle_analytics\"><span>Cycle Analytics</span>\n</a></li><li class=\"\"><a title=\"Insights\" class=\"shortcuts-project-insights\" data-qa-selector=\"project_insights_link\" href=\"/cznic/xc/insights/\"><span>Insights</span>\n</a></li>\n</ul>\n</li><li class=\"active\"><a class=\"shortcuts-tree qa-project-menu-repo\" href=\"/cznic/xc/tree/master\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-text\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-repo-link\">\nRepository\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item active\"><a href=\"/cznic/xc/tree/master\"><strong class=\"fly-out-top-item-name\">\nRepository\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"active\"><a href=\"/cznic/xc/tree/master\">Files\n</a></li><li class=\"\"><a id=\"js-onboarding-commits-link\" href=\"/cznic/xc/commits/master\">Commits\n</a></li><li class=\"\"><a class=\"qa-branches-link\" id=\"js-onboarding-branches-link\" href=\"/cznic/xc/-/branches\">Branches\n</a></li><li class=\"\"><a href=\"/cznic/xc/-/tags\">Tags\n</a></li><li class=\"\"><a href=\"/cznic/xc/-/graphs/master\">Contributors\n</a></li><li class=\"\"><a href=\"/cznic/xc/-/network/master\">Graph\n</a></li><li class=\"\"><a href=\"/cznic/xc/compare?from=master&amp;to=master\">Compare\n</a></li><li class=\"\"><a href=\"/cznic/xc/-/graphs/master/charts\">Charts\n</a></li><li class=\"\"><a data-qa-selector=\"path_locks_link\" href=\"/cznic/xc/path_locks\">Locked Files\n</a></li>\n</ul>\n</li><li class=\"\"><a class=\"shortcuts-issues qa-issues-item\" href=\"/cznic/xc/issues\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#issues\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-issues-link\">\nIssues\n</span>\n<span class=\"badge badge-pill count issue_counter\">\n0\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/issues\"><strong class=\"fly-out-top-item-name\">\nIssues\n</strong>\n<span class=\"badge badge-pill count issue_counter fly-out-badge\">\n0\n</span>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Issues\" href=\"/cznic/xc/issues\"><span>\nList\n</span>\n</a></li><li class=\"\"><a title=\"Boards\" data-qa-selector=\"issue_boards_link\" href=\"/cznic/xc/-/boards\"><span>\nBoards\n</span>\n</a></li><li class=\"\"><a title=\"Labels\" class=\"qa-labels-link\" href=\"/cznic/xc/-/labels\"><span>\nLabels\n</span>\n</a></li><li class=\"\"><a title=\"Service Desk\" href=\"/cznic/xc/issues/service_desk\">Service Desk\n</a></li>\n<li class=\"\"><a title=\"Milestones\" class=\"qa-milestones-link\" href=\"/cznic/xc/-/milestones\"><span>\nMilestones\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-merge_requests\" data-qa-selector=\"merge_requests_link\" href=\"/cznic/xc/merge_requests\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#git-merge\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-mr-link\">\nMerge Requests\n</span>\n<span class=\"badge badge-pill count merge_counter js-merge-counter\">\n0\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/merge_requests\"><strong class=\"fly-out-top-item-name\">\nMerge Requests\n</strong>\n<span class=\"badge badge-pill count merge_counter js-merge-counter fly-out-badge\">\n0\n</span>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-pipelines qa-link-pipelines rspec-link-pipelines\" data-qa-selector=\"ci_cd_link\" href=\"/cznic/xc/pipelines\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#rocket\"></use></svg>\n</div>\n<span class=\"nav-item-name\" id=\"js-onboarding-pipelines-link\">\nCI / CD\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/pipelines\"><strong class=\"fly-out-top-item-name\">\nCI / CD\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Pipelines\" class=\"shortcuts-pipelines\" href=\"/cznic/xc/pipelines\"><span>\nPipelines\n</span>\n</a></li><li class=\"\"><a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/xc/-/jobs\"><span>\nJobs\n</span>\n</a></li><li class=\"\"><a title=\"Schedules\" class=\"shortcuts-builds\" href=\"/cznic/xc/pipeline_schedules\"><span>\nSchedules\n</span>\n</a></li><li class=\"\"><a title=\"Charts\" class=\"shortcuts-pipelines-charts\" href=\"/cznic/xc/pipelines/charts\"><span>\nCharts\n</span>\n</a></li></ul>\n</li><li class=\"\"><a data-qa-selector=\"dependency_list_link\" href=\"/cznic/xc/dependencies\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#shield\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSecurity &amp; Compliance\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/dependencies\"><strong class=\"fly-out-top-item-name\">\nSecurity &amp; Compliance\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Dependency List\" data-qa-selector=\"dependency_list_link\" href=\"/cznic/xc/dependencies\"><span>Dependency List</span>\n</a></li><li class=\"\"><a title=\"License Compliance\" data-qa-selector=\"licenses_list_link\" href=\"/cznic/xc/-/licenses\"><span>License Compliance</span>\n</a></li></ul>\n</li>\n<li class=\"\"><a data-qa-selector=\"packages_link\" href=\"/cznic/xc/-/packages\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#package\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nPackages\n</span>\n</a><ul class=\"sidebar-sub-level-items\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/-/packages\"><strong class=\"fly-out-top-item-name\">\nPackages\n</strong>\n</a></li><li class=\"divider fly-out-top-item\"></li>\n<li class=\"\"><a title=\"Packages\" href=\"/cznic/xc/-/packages\"><span>List</span>\n</a></li><li class=\"\"><a class=\"shortcuts-container-registry\" title=\"Container Registry\" href=\"/cznic/xc/container_registry\"><span>Container Registry</span>\n</a></li></ul>\n</li>\n\n<li class=\"\"><a class=\"shortcuts-wiki\" data-qa-selector=\"wiki_link\" href=\"/cznic/xc/-/wikis/home\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#book\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nWiki\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/-/wikis/home\"><strong class=\"fly-out-top-item-name\">\nWiki\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a class=\"shortcuts-snippets\" href=\"/cznic/xc/snippets\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#snippet\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nSnippets\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/snippets\"><strong class=\"fly-out-top-item-name\">\nSnippets\n</strong>\n</a></li></ul>\n</li><li class=\"\"><a title=\"Members\" class=\"shortcuts-tree\" href=\"/cznic/xc/-/settings/members\"><div class=\"nav-icon-container\">\n<svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#users\"></use></svg>\n</div>\n<span class=\"nav-item-name\">\nMembers\n</span>\n</a><ul class=\"sidebar-sub-level-items is-fly-out-only\">\n<li class=\"fly-out-top-item\"><a href=\"/cznic/xc/-/project_members\"><strong class=\"fly-out-top-item-name\">\nMembers\n</strong>\n</a></li></ul>\n</li><a class=\"toggle-sidebar-button js-toggle-sidebar qa-toggle-sidebar rspec-toggle-sidebar\" role=\"button\" title=\"Toggle sidebar\" type=\"button\">\n<svg class=\"icon-angle-double-left\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-left\"></use></svg>\n<svg class=\"icon-angle-double-right\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-double-right\"></use></svg>\n<span class=\"collapse-text\">Collapse sidebar</span>\n</a>\n<button name=\"button\" type=\"button\" class=\"close-nav-button\"><svg class=\"s16\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#close\"></use></svg>\n<span class=\"collapse-text\">Close sidebar</span>\n</button>\n<li class=\"hidden\">\n<a title=\"Activity\" class=\"shortcuts-project-activity\" href=\"/cznic/xc/activity\"><span>\nActivity\n</span>\n</a></li>\n<li class=\"hidden\">\n<a title=\"Network\" class=\"shortcuts-network\" href=\"/cznic/xc/-/network/master\">Graph\n</a></li>\n<li class=\"hidden\">\n<a title=\"Charts\" class=\"shortcuts-repository-charts\" href=\"/cznic/xc/-/graphs/master/charts\">Charts\n</a></li>\n<li class=\"hidden\">\n<a class=\"shortcuts-new-issue\" href=\"/cznic/xc/issues/new\">Create a new issue\n</a></li>\n<li class=\"hidden\">\n<a title=\"Jobs\" class=\"shortcuts-builds\" href=\"/cznic/xc/-/jobs\">Jobs\n</a></li>\n<li class=\"hidden\">\n<a title=\"Commits\" class=\"shortcuts-commits\" href=\"/cznic/xc/commits/master\">Commits\n</a></li>\n<li class=\"hidden\">\n<a title=\"Issue Boards\" class=\"shortcuts-issue-boards\" href=\"/cznic/xc/-/boards\">Issue Boards</a>\n</li>\n</ul>\n</div>\n</div>\n\n<div class=\"content-wrapper\">\n\n<div class=\"mobile-overlay\"></div>\n<div class=\"alert-wrapper\">\n\n\n\n\n\n\n<nav class=\"breadcrumbs container-fluid container-limited\" role=\"navigation\">\n<div class=\"breadcrumbs-container\">\n<button name=\"button\" type=\"button\" class=\"toggle-mobile-nav\"><span class=\"sr-only\">Open sidebar</span>\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-bars\"></i>\n</button><div class=\"breadcrumbs-links js-title-container\">\n<ul class=\"list-unstyled breadcrumbs-list js-breadcrumbs-list\">\n<li><a href=\"/cznic\">cznic</a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li> <li><a href=\"/cznic/xc\"><span class=\"breadcrumb-item-text js-breadcrumb-item-text\">xc</span></a><svg class=\"s8 breadcrumbs-list-angle\"><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#angle-right\"></use></svg></li>\n\n<li>\n<h2 class=\"breadcrumbs-sub-title\"><a href=\"/cznic/xc/blob/master/LICENSE\">Repository</a></h2>\n</li>\n</ul>\n</div>\n\n</div>\n</nav>\n\n<div class=\"d-flex\"></div>\n</div>\n<div class=\"container-fluid container-limited \">\n<div class=\"content\" id=\"content-body\">\n<div class=\"flash-container flash-container-page sticky\">\n</div>\n\n<div class=\"js-signature-container\" data-signatures-path=\"/cznic/xc/commits/d53e07eebaac2bbe0fb7ee7f994d86e37ae18bdd/signatures?limit=1\"></div>\n\n<div class=\"tree-holder\" id=\"tree-holder\">\n<div class=\"nav-block\">\n<div class=\"tree-ref-container\">\n<div class=\"tree-ref-holder\">\n<form class=\"project-refs-form\" action=\"/cznic/xc/refs/switch\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"destination\" id=\"destination\" value=\"blob\" />\n<input type=\"hidden\" name=\"path\" id=\"path\" value=\"LICENSE\" />\n<div class=\"dropdown\">\n<button class=\"dropdown-menu-toggle js-project-refs-dropdown qa-branches-select\" type=\"button\" data-toggle=\"dropdown\" data-selected=\"master\" data-ref=\"master\" data-refs-url=\"/cznic/xc/refs?sort=updated_desc\" data-field-name=\"ref\" data-submit-form-on-click=\"true\" data-visit=\"true\"><span class=\"dropdown-toggle-text \">master</span><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-chevron-down\"></i></button>\n<div class=\"dropdown-menu dropdown-menu-paging dropdown-menu-selectable git-revision-dropdown qa-branches-dropdown\">\n<div class=\"dropdown-page-one\">\n<div class=\"dropdown-title\"><span>Switch branch/tag</span><button class=\"dropdown-title-button dropdown-menu-close\" aria-label=\"Close\" type=\"button\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-times dropdown-menu-close-icon\"></i></button></div>\n<div class=\"dropdown-input\"><input type=\"search\" id=\"\" class=\"dropdown-input-field qa-dropdown-input-field\" placeholder=\"Search branches and tags\" autocomplete=\"off\" /><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search dropdown-input-search\"></i><i aria-hidden=\"true\" data-hidden=\"true\" role=\"button\" class=\"fa fa-times dropdown-input-clear js-dropdown-input-clear\"></i></div>\n<div class=\"dropdown-content\"></div>\n<div class=\"dropdown-loading\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spinner fa-spin\"></i></div>\n</div>\n</div>\n</div>\n</form>\n</div>\n<ul class=\"breadcrumb repo-breadcrumb\">\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/xc/tree/master\">xc\n</a></li>\n<li class=\"breadcrumb-item\">\n<a href=\"/cznic/xc/blob/master/LICENSE\"><strong>LICENSE</strong>\n</a></li>\n</ul>\n</div>\n<div class=\"tree-controls\"><a class=\"btn shortcuts-find-file\" rel=\"nofollow\" href=\"/cznic/xc/find_file/master\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-search\"></i>\n<span>Find file</span>\n</a><a class=\"btn js-blob-blame-link\" href=\"/cznic/xc/blame/master/LICENSE\">Blame</a><a class=\"btn\" href=\"/cznic/xc/commits/master/LICENSE\">History</a><a class=\"btn js-data-file-blob-permalink-url\" href=\"/cznic/xc/blob/a7eea224e9d8ecdaa83c8e29891d88a4f527dba4/LICENSE\">Permalink</a></div>\n</div>\n\n<div class=\"info-well d-none d-sm-block\">\n<div class=\"well-segment\">\n<ul class=\"blob-commit-info\">\n<li class=\"commit flex-row js-toggle-container\" id=\"commit-d53e07ee\">\n<div class=\"avatar-cell d-none d-sm-block\">\n<a href=\"/cznic\"><img alt=\"cznic&#39;s avatar\" src=\"/uploads/-/system/user/avatar/2447325/avatar.png?width=40\" class=\"avatar s40 d-none d-sm-inline-block\" title=\"cznic\" /></a>\n</div>\n<div class=\"commit-detail flex-list\">\n<div class=\"commit-content qa-commit-content\">\n<a class=\"commit-row-message item-title js-onboarding-commit-item\" href=\"/cznic/xc/commit/d53e07eebaac2bbe0fb7ee7f994d86e37ae18bdd\">Add content.</a>\n<span class=\"commit-row-message d-inline d-sm-none\">\n&middot;\nd53e07ee\n</span>\n<div class=\"committer\">\n<a class=\"commit-author-link js-user-link\" data-user-id=\"2447325\" href=\"/cznic\">cznic</a> authored <time class=\"js-timeago\" title=\"Sep 22, 2015 2:42pm\" datetime=\"2015-09-22T14:42:38Z\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\">Sep 22, 2015</time>\n</div>\n\n</div>\n<div class=\"commit-actions flex-row\">\n\n<div class=\"js-commit-pipeline-status\" data-endpoint=\"/cznic/xc/commit/d53e07eebaac2bbe0fb7ee7f994d86e37ae18bdd/pipelines?ref=master\"></div>\n<div class=\"commit-sha-group d-none d-sm-flex\">\n<div class=\"label label-monospace monospace\">\nd53e07ee\n</div>\n<button class=\"btn btn btn-default\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-title=\"Copy commit SHA\" data-class=\"btn btn-default\" data-clipboard-text=\"d53e07eebaac2bbe0fb7ee7f994d86e37ae18bdd\" type=\"button\" title=\"Copy commit SHA\" aria-label=\"Copy commit SHA\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n\n</div>\n</div>\n</div>\n</li>\n\n</ul>\n</div>\n\n<div class=\"well-segment blob-auxiliary-viewer\">\n<div class=\"blob-viewer\" data-type=\"auxiliary\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-balance-scale fa-fw\"></i>\nThis project is licensed under the\n<strong>BSD 3-clause &quot;New&quot; or &quot;Revised&quot; License</strong>.\n<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://choosealicense.com/licenses/bsd-3-clause/\">Learn more</a>\n\n</div>\n\n</div>\n\n</div>\n<div class=\"blob-content-holder\" id=\"blob-content-holder\">\n<article class=\"file-holder\">\n<div class=\"js-file-title file-title-flex-parent\">\n<div class=\"file-header-content\">\n<i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-file-text-o fa-fw\"></i>\n<strong class=\"file-title-name qa-file-title-name\">\nLICENSE\n</strong>\n<button class=\"btn btn-clipboard btn-transparent\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn-clipboard btn-transparent\" data-title=\"Copy file path\" data-clipboard-text=\"{&quot;text&quot;:&quot;LICENSE&quot;,&quot;gfm&quot;:&quot;`LICENSE`&quot;}\" type=\"button\" title=\"Copy file path\" aria-label=\"Copy file path\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button>\n<small class=\"mr-1\">\n1.45 KB\n</small>\n</div>\n\n<div class=\"file-actions\">\n\n<div class=\"btn-group\" role=\"group\"><a class=\"btn btn-primary js-edit-blob  btn-sm\" href=\"/cznic/xc/edit/master/LICENSE\">Edit</a><a class=\"btn btn-inverted btn-primary ide-edit-button btn-sm\" href=\"/-/ide/project/cznic/xc/edit/master/-/LICENSE\">Web IDE</a></div>\n<div class=\"btn-group\" role=\"group\">\n</div>\n<div class=\"btn-group\" role=\"group\"><button class=\"btn btn btn-sm js-copy-blob-source-btn\" data-toggle=\"tooltip\" data-placement=\"bottom\" data-container=\"body\" data-class=\"btn btn-sm js-copy-blob-source-btn\" data-title=\"Copy file contents\" data-clipboard-target=\".blob-content[data-blob-id=&#39;2a9776e4a300142319828f32dab6138e556611e2&#39;]\" type=\"button\" title=\"Copy file contents\" aria-label=\"Copy file contents\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#duplicate\"></use></svg></button><a class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open raw\" title=\"Open raw\" data-container=\"body\" href=\"/cznic/xc/raw/master/LICENSE\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#doc-code\"></use></svg></a><a download=\"LICENSE\" class=\"btn btn-sm has-tooltip\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Download\" title=\"Download\" data-container=\"body\" href=\"/cznic/xc/raw/master/LICENSE?inline=false\"><svg><use xlink:href=\"https://gitlab.com/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg#download\"></use></svg></a></div>\n</div>\n</div>\n\n<script id=\"js-file-lock\" type=\"application/json\">\n{\"path\":\"LICENSE\",\"toggle_path\":\"/cznic/xc/path_locks/toggle\"}\n</script>\n\n\n<div class=\"blob-viewer\" data-type=\"simple\" data-url=\"/cznic/xc/blob/master/LICENSE?format=json&amp;viewer=simple\">\n<div class=\"text-center prepend-top-default append-bottom-default\">\n<i aria-hidden=\"true\" aria-label=\"Loading content…\" class=\"fa fa-spinner fa-spin fa-2x qa-spinner\"></i>\n</div>\n\n</div>\n\n\n</article>\n</div>\n\n<div class=\"modal\" id=\"modal-upload-blob\">\n<div class=\"modal-dialog modal-lg\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3 class=\"page-title\">Replace LICENSE</h3>\n<button aria-label=\"Close\" class=\"close\" data-dismiss=\"modal\" type=\"button\">\n<span aria-hidden>&times;</span>\n</button>\n</div>\n<div class=\"modal-body\">\n<form class=\"js-quick-submit js-upload-blob-form\" data-method=\"put\" action=\"/cznic/xc/update/master/LICENSE\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"_method\" value=\"put\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"t/svUWLjGW0k/7TSTrwMfEFcIWAxcPnEjiBZ8HddLMHqLkkIC8BVIKOYJCTRPyw5WDM8oXWVnmBxOMKbtTXxzA==\" /><div class=\"dropzone\">\n<div class=\"dropzone-previews blob-upload-dropzone-previews\">\n<p class=\"dz-message light\">\nAttach a file by drag &amp; drop or <a class=\"markdown-selector\" href=\"#\">click to upload</a>\n</p>\n</div>\n</div>\n<br>\n<div class=\"dropzone-alerts alert alert-danger data\" style=\"display:none\"></div>\n<div class=\"form-group row commit_message-group\">\n<label class=\"col-form-label col-sm-2\" for=\"commit_message-cb65cb99138adabbe3e108995f5d4582\">Commit message\n</label><div class=\"col-sm-10\">\n<div class=\"commit-message-container\">\n<div class=\"max-width-marker\"></div>\n<textarea name=\"commit_message\" id=\"commit_message-cb65cb99138adabbe3e108995f5d4582\" class=\"form-control js-commit-message\" placeholder=\"Replace LICENSE\" required=\"required\" rows=\"3\">\nReplace LICENSE</textarea>\n</div>\n</div>\n</div>\n\n<input type=\"hidden\" name=\"branch_name\" id=\"branch_name\" />\n<input type=\"hidden\" name=\"create_merge_request\" id=\"create_merge_request\" value=\"1\" />\n<input type=\"hidden\" name=\"original_branch\" id=\"original_branch\" value=\"master\" class=\"js-original-branch\" />\n\n<div class=\"form-actions\">\n<button name=\"button\" type=\"button\" class=\"btn btn-success btn-upload-file\" id=\"submit-all\"><i aria-hidden=\"true\" data-hidden=\"true\" class=\"fa fa-spin fa-spinner js-loading-icon hidden\"></i>\nReplace file\n</button><a class=\"btn btn-cancel\" data-dismiss=\"modal\" href=\"#\">Cancel</a>\n<div class=\"inline prepend-left-10\">\nA new branch will be created in your fork and a new merge request will be started.\n</div>\n\n</div>\n</form></div>\n</div>\n</div>\n</div>\n\n</div>\n\n</div>\n</div>\n</div>\n</div>\n\n\n\n\n</body>\n</html>\n\n\n--------------------------------------------------------------------------------\nheketi/utils  Apache License 2.0  https://github.com/heketi/heketi/blob/master/LICENSE\n--------------------------------------------------------------------------------\n\n\n\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars0.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars1.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars2.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars3.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-hddDYPWR0gBbqLRmIZP242WMEiYsVkYI2UCYCVUHB4h5DhD2cbtFJYG+HPh21dZGb+sbgDHxQBNJCBq7YbmlBQ==\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/frameworks-02a3eaa24db2bd1ed9b64450595fc2cf.css\" />\n  <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-zWr4N1VWM8vyTn58rsleo3nkt4rOaqbF4yOqvpy2fJvUoZeG6baCy/xLXQ/Y8PLBzpQVg+UTbEmOLl+OI6tr+g==\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/site-0a9510c049d01c51f42259bdf49696be.css\" />\n    <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-/cDjVH+IaE87Rpuj2/qVqKm34ivtGXaGNQO78KB3QyXnu9KzhlVymfEv5eMg7kpqaDcyelwZDvppJ1QAbRTADQ==\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/github-7cd9be2691657ef30a01b0fb565df9f2.css\" />\n    \n    \n    \n    \n\n\n  <meta name=\"viewport\" content=\"width=device-width\">\n  \n  <title>heketi/LICENSE at master · heketi/heketi · GitHub</title>\n    <meta name=\"description\" content=\"RESTful based volume management framework for GlusterFS - heketi/heketi\">\n    <link rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"/opensearch.xml\" title=\"GitHub\">\n  <link rel=\"fluid-icon\" href=\"https://github.com/fluidicon.png\" title=\"GitHub\">\n  <meta property=\"fb:app_id\" content=\"1401488693436528\">\n\n    <meta name=\"twitter:image:src\" content=\"https://avatars3.githubusercontent.com/u/12890374?s=400&amp;v=4\" /><meta name=\"twitter:site\" content=\"@github\" /><meta name=\"twitter:card\" content=\"summary\" /><meta name=\"twitter:title\" content=\"heketi/heketi\" /><meta name=\"twitter:description\" content=\"RESTful based volume management framework for GlusterFS - heketi/heketi\" />\n    <meta property=\"og:image\" content=\"https://avatars3.githubusercontent.com/u/12890374?s=400&amp;v=4\" /><meta property=\"og:site_name\" content=\"GitHub\" /><meta property=\"og:type\" content=\"object\" /><meta property=\"og:title\" content=\"heketi/heketi\" /><meta property=\"og:url\" content=\"https://github.com/heketi/heketi\" /><meta property=\"og:description\" content=\"RESTful based volume management framework for GlusterFS - heketi/heketi\" />\n\n  <link rel=\"assets\" href=\"https://github.githubassets.com/\">\n  \n  \n\n    <meta name=\"request-id\" content=\"CC09:4D16:28C560:4E13B5:5E20F45C\" data-pjax-transient>\n\n\n\n  \n\n  <meta name=\"selected-link\" value=\"repo_source\" data-pjax-transient>\n\n      <meta name=\"google-site-verification\" content=\"KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r1XQysX3xurLU\">\n    <meta name=\"google-site-verification\" content=\"ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVihD0exw2fsA\">\n    <meta name=\"google-site-verification\" content=\"GXs5KoUUkNCoaAZn7wPN-t01Pywp9M3sEjnt_3_ZWPc\">\n\n    <meta name=\"octolytics-host\" content=\"collector.githubapp.com\" /><meta name=\"octolytics-app-id\" content=\"github\" /><meta name=\"octolytics-event-url\" content=\"https://collector.githubapp.com/github-external/browser_event\" /><meta name=\"octolytics-dimension-request_id\" content=\"CC09:4D16:28C560:4E13B5:5E20F45C\" /><meta name=\"octolytics-dimension-region_edge\" content=\"iad\" /><meta name=\"octolytics-dimension-region_render\" content=\"iad\" /><meta name=\"octolytics-dimension-ga_id\" content=\"\" class=\"js-octo-ga-id\" /><meta name=\"octolytics-dimension-visitor_id\" content=\"6913629061476578396\" />\n\n<meta name=\"analytics-location\" content=\"/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show\" data-pjax-transient=\"true\" />\n\n\n\n    <meta name=\"google-analytics\" content=\"UA-3769691-2\">\n\n\n<meta class=\"js-ga-set\" name=\"dimension1\" content=\"Logged Out\">\n\n\n\n  \n\n      <meta name=\"hostname\" content=\"github.com\">\n    <meta name=\"user-login\" content=\"\">\n\n      <meta name=\"expected-hostname\" content=\"github.com\">\n\n      <meta name=\"js-proxy-site-detection-payload\" content=\"NWIzZTBkYzUxNmEyOTBkNzk5NDM5OWU5Y2MyNDk2NDhlM2JjM2JhMjhjZmI4ODVmNDY4ZmNiNzlkN2U4ZjVlYnx7InJlbW90ZV9hZGRyZXNzIjoiMTA0LjEzMy45LjcwIiwicmVxdWVzdF9pZCI6IkNDMDk6NEQxNjoyOEM1NjA6NEUxM0I1OjVFMjBGNDVDIiwidGltZXN0YW1wIjoxNTc5MjE4MDEyLCJob3N0IjoiZ2l0aHViLmNvbSJ9\">\n\n    <meta name=\"enabled-features\" content=\"MARKETPLACE_FEATURED_BLOG_POSTS,MARKETPLACE_INVOICED_BILLING,MARKETPLACE_SOCIAL_PROOF_CUSTOMERS,MARKETPLACE_TRENDING_SOCIAL_PROOF,MARKETPLACE_RECOMMENDATIONS,MARKETPLACE_PENDING_INSTALLATIONS\">\n\n    <meta name=\"html-safe-nonce\" content=\"1642a980f43757775df5a02ed917203a1b73d7c3\">\n\n  <meta http-equiv=\"x-pjax-version\" content=\"5e0094cbbb771240ede4fb72730ad954\">\n  \n\n      <link href=\"https://github.com/heketi/heketi/commits/master.atom\" rel=\"alternate\" title=\"Recent Commits to heketi:master\" type=\"application/atom+xml\">\n\n  <meta name=\"go-import\" content=\"github.com/heketi/heketi git https://github.com/heketi/heketi.git\">\n\n  <meta name=\"octolytics-dimension-user_id\" content=\"12890374\" /><meta name=\"octolytics-dimension-user_login\" content=\"heketi\" /><meta name=\"octolytics-dimension-repository_id\" content=\"37446835\" /><meta name=\"octolytics-dimension-repository_nwo\" content=\"heketi/heketi\" /><meta name=\"octolytics-dimension-repository_public\" content=\"true\" /><meta name=\"octolytics-dimension-repository_is_fork\" content=\"false\" /><meta name=\"octolytics-dimension-repository_network_root_id\" content=\"37446835\" /><meta name=\"octolytics-dimension-repository_network_root_nwo\" content=\"heketi/heketi\" /><meta name=\"octolytics-dimension-repository_explore_github_marketplace_ci_cta_shown\" content=\"false\" />\n\n\n    <link rel=\"canonical\" href=\"https://github.com/heketi/heketi/blob/master/LICENSE\" data-pjax-transient>\n\n\n  <meta name=\"browser-stats-url\" content=\"https://api.github.com/_private/browser/stats\">\n\n  <meta name=\"browser-errors-url\" content=\"https://api.github.com/_private/browser/errors\">\n\n  <link rel=\"mask-icon\" href=\"https://github.githubassets.com/pinned-octocat.svg\" color=\"#000000\">\n  <link rel=\"icon\" type=\"image/x-icon\" class=\"js-site-favicon\" href=\"https://github.githubassets.com/favicon.ico\">\n\n<meta name=\"theme-color\" content=\"#1e2327\">\n\n\n  <link rel=\"manifest\" href=\"/manifest.json\" crossOrigin=\"use-credentials\">\n\n  </head>\n\n  <body class=\"logged-out env-production page-responsive page-blob\">\n    \n\n  <div class=\"position-relative js-header-wrapper \">\n    <a href=\"#start-of-content\" tabindex=\"1\" class=\"px-2 py-4 bg-blue text-white show-on-focus js-skip-to-content\">Skip to content</a>\n    <span class=\"Progress progress-pjax-loader position-fixed width-full js-pjax-loader-bar\">\n      <span class=\"progress-pjax-loader-bar top-0 left-0\" style=\"width: 0%;\"></span>\n    </span>\n\n    \n    \n    \n\n\n        <header class=\"Header-old header-logged-out js-details-container Details position-relative f4 py-2\" role=\"banner\">\n  <div class=\"container-lg d-lg-flex flex-items-center p-responsive\">\n    <div class=\"d-flex flex-justify-between flex-items-center\">\n        <a class=\"mr-4\" href=\"https://github.com/\" aria-label=\"Homepage\" data-ga-click=\"(Logged out) Header, go to homepage, icon:logo-wordmark\">\n          <svg height=\"32\" class=\"octicon octicon-mark-github text-white\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"32\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"/></svg>\n        </a>\n\n          <div class=\"d-lg-none css-truncate css-truncate-target width-fit p-2\">\n            \n              <svg class=\"octicon octicon-repo\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n    <a class=\"Header-link\" href=\"/heketi\">heketi</a>\n    /\n    <a class=\"Header-link\" href=\"/heketi/heketi\">heketi</a>\n\n\n          </div>\n\n        <div class=\"d-flex flex-items-center\">\n            <a href=\"/join?source=header-repo\"\n              class=\"d-inline-block d-lg-none f5 text-white no-underline border border-gray-dark rounded-2 px-2 py-1 mr-3 mr-sm-5\"\n              data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;CC09:4D16:28C560:4E13B5:5E20F45C&quot;,&quot;originating_url&quot;:&quot;https://github.com/heketi/heketi/blob/master/LICENSE&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"e3d22afd6bcb0be4abf24157fe916296e908a0ebcb1a48af81fb59a63df7c722\"\n              data-ga-click=\"(Logged out) Header, clicked Sign up, text:sign-up\">\n              Sign&nbsp;up\n            </a>\n\n          <button class=\"btn-link d-lg-none mt-1 js-details-target\" type=\"button\" aria-label=\"Toggle navigation\" aria-expanded=\"false\">\n            <svg height=\"24\" class=\"octicon octicon-three-bars text-white\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"18\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.41 9H.59C0 9 0 8.59 0 8c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zm0-4H.59C0 5 0 4.59 0 4c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zM.59 11H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1H.59C0 13 0 12.59 0 12c0-.59 0-1 .59-1z\"/></svg>\n          </button>\n        </div>\n    </div>\n\n    <div class=\"HeaderMenu HeaderMenu--logged-out position-fixed top-0 right-0 bottom-0 height-fit position-lg-relative d-lg-flex flex-justify-between flex-items-center flex-auto\">\n      <div class=\"d-flex d-lg-none flex-justify-end border-bottom bg-gray-light p-3\">\n        <button class=\"btn-link js-details-target\" type=\"button\" aria-label=\"Toggle navigation\" aria-expanded=\"false\">\n          <svg height=\"24\" class=\"octicon octicon-x text-gray\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"18\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"/></svg>\n        </button>\n      </div>\n\n        <nav class=\"mt-0 px-3 px-lg-0 mb-5 mb-lg-0\" aria-label=\"Global\">\n          <ul class=\"d-lg-flex list-style-none\">\n              <li class=\"d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center \">\n                <details class=\"HeaderMenu-details details-overlay details-reset width-full\">\n                  <summary class=\"HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block\">\n                    Why GitHub?\n                    <svg x=\"0px\" y=\"0px\" viewBox=\"0 0 14 8\" xml:space=\"preserve\" fill=\"none\" class=\"icon-chevon-down-mktg position-absolute position-lg-relative\">\n                      <path d=\"M1,1l6.2,6L13,1\"></path>\n                    </svg>\n                  </summary>\n                  <div class=\"dropdown-menu flex-auto rounded-1 bg-white px-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4\">\n                    <a href=\"/features\" class=\"py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Features\">Features <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a>\n                    <ul class=\"list-style-none f5 pb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/features/code-review/\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Code review\">Code review</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/project-management/\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Project management\">Project management</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/integrations\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Integrations\">Integrations</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/actions\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Actions\">Actions</a></li>\n                          <li class=\"edge-item-fix\"><a href=\"/features/packages\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to GitHub Packages\">Packages</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/security\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Security\">Security</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features#team-management\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Team management\">Team management</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features#hosting\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Code hosting\">Hosting</a></li>\n                    </ul>\n\n                    <ul class=\"list-style-none mb-0 border-lg-top pt-lg-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/customer-stories\" class=\"py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Customer stories\">Customer stories <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/security\" class=\"py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Security\">Security <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                    </ul>\n                  </div>\n                </details>\n              </li>\n              <li class=\"border-bottom border-lg-bottom-0 mr-0 mr-lg-3\">\n                <a href=\"/enterprise\" class=\"HeaderMenu-link no-underline py-3 d-block d-lg-inline-block\" data-ga-click=\"(Logged out) Header, go to Enterprise\">Enterprise</a>\n              </li>\n\n              <li class=\"d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center \">\n                <details class=\"HeaderMenu-details details-overlay details-reset width-full\">\n                  <summary class=\"HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block\">\n                    Explore\n                    <svg x=\"0px\" y=\"0px\" viewBox=\"0 0 14 8\" xml:space=\"preserve\" fill=\"none\" class=\"icon-chevon-down-mktg position-absolute position-lg-relative\">\n                      <path d=\"M1,1l6.2,6L13,1\"></path>\n                    </svg>\n                  </summary>\n\n                  <div class=\"dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4\">\n                    <ul class=\"list-style-none mb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/explore\" class=\"py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Explore\">Explore GitHub <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                    </ul>\n\n                    <h4 class=\"text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3\">Learn &amp; contribute</h4>\n                    <ul class=\"list-style-none mb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/topics\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Topics\">Topics</a></li>\n                        <li class=\"edge-item-fix\"><a href=\"/collections\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Collections\">Collections</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/trending\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Trending\">Trending</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://lab.github.com/\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Learning lab\">Learning Lab</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://opensource.guide\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Open source guides\">Open source guides</a></li>\n                    </ul>\n\n                    <h4 class=\"text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3\">Connect with others</h4>\n                    <ul class=\"list-style-none mb-0\">\n                      <li class=\"edge-item-fix\"><a href=\"https://github.com/events\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Events\">Events</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://github.community\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Community forum\">Community forum</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://education.github.com\" class=\"py-2 pb-0 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to GitHub Education\">GitHub Education</a></li>\n                    </ul>\n                  </div>\n                </details>\n              </li>\n\n              <li class=\"border-bottom border-lg-bottom-0 mr-0 mr-lg-3\">\n                <a href=\"/marketplace\" class=\"HeaderMenu-link no-underline py-3 d-block d-lg-inline-block\" data-ga-click=\"(Logged out) Header, go to Marketplace\">Marketplace</a>\n              </li>\n\n              <li class=\"d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center \">\n                <details class=\"HeaderMenu-details details-overlay details-reset width-full\">\n                  <summary class=\"HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block\">\n                    Pricing\n                    <svg x=\"0px\" y=\"0px\" viewBox=\"0 0 14 8\" xml:space=\"preserve\" fill=\"none\" class=\"icon-chevon-down-mktg position-absolute position-lg-relative\">\n                       <path d=\"M1,1l6.2,6L13,1\"></path>\n                    </svg>\n                  </summary>\n\n                  <div class=\"dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-4 mt-0 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4\">\n                    <a href=\"/pricing\" class=\"pb-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Pricing\">Plans <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a>\n\n                    <ul class=\"list-style-none mb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/pricing#feature-comparison\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Compare plans\">Compare plans</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://enterprise.github.com/contact\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Contact Sales\">Contact Sales</a></li>\n                    </ul>\n\n                    <ul class=\"list-style-none mb-0 border-lg-top pt-lg-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/nonprofit\" class=\"py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Nonprofits\">Nonprofit <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://education.github.com\" class=\"py-2 pb-0 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\"  data-ga-click=\"(Logged out) Header, go to Education\">Education <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                    </ul>\n                  </div>\n                </details>\n              </li>\n          </ul>\n        </nav>\n\n      <div class=\"d-lg-flex flex-items-center px-3 px-lg-0 text-center text-lg-left\">\n          <div class=\"d-lg-flex mb-3 mb-lg-0\">\n            <div class=\"header-search flex-self-stretch flex-lg-self-auto mr-0 mr-lg-3 mb-3 mb-lg-0 scoped-search site-scoped-search js-site-search position-relative js-jump-to\"\n  role=\"combobox\"\n  aria-owns=\"jump-to-results\"\n  aria-label=\"Search or jump to\"\n  aria-haspopup=\"listbox\"\n  aria-expanded=\"false\"\n>\n  <div class=\"position-relative\">\n    <!-- '\"` --><!-- </textarea></xmp> --></option></form><form class=\"js-site-search-form\" role=\"search\" aria-label=\"Site\" data-scope-type=\"Repository\" data-scope-id=\"37446835\" data-scoped-search-url=\"/heketi/heketi/search\" data-unscoped-search-url=\"/search\" action=\"/heketi/heketi/search\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" />\n      <label class=\"form-control input-sm header-search-wrapper p-0 header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center js-chromeless-input-container\">\n        <input type=\"text\"\n          class=\"form-control input-sm header-search-input jump-to-field js-jump-to-field js-site-search-focus js-site-search-field is-clearable\"\n          data-hotkey=\"s,/\"\n          name=\"q\"\n          value=\"\"\n          placeholder=\"Search\"\n          data-unscoped-placeholder=\"Search GitHub\"\n          data-scoped-placeholder=\"Search\"\n          autocapitalize=\"off\"\n          aria-autocomplete=\"list\"\n          aria-controls=\"jump-to-results\"\n          aria-label=\"Search\"\n          data-jump-to-suggestions-path=\"/_graphql/GetSuggestedNavigationDestinations#csrf-token=FaiSgHZpGzYxaC2DKH8pmzLmi6/kBzkswKhA+UioAv4xmT0V9surEp0fyNtXjJMORLiECJ3Grwvv3RG+bsBlSA==\"\n          spellcheck=\"false\"\n          autocomplete=\"off\"\n          >\n          <input type=\"hidden\" class=\"js-site-search-type-field\" name=\"type\" >\n            <img src=\"https://github.githubassets.com/images/search-key-slash.svg\" alt=\"\" class=\"mr-2 header-search-key-slash\">\n\n            <div class=\"Box position-absolute overflow-hidden d-none jump-to-suggestions js-jump-to-suggestions-container\">\n              \n<ul class=\"d-none js-jump-to-suggestions-template-container\">\n  \n\n<li class=\"d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-suggestion\" role=\"option\">\n  <a tabindex=\"-1\" class=\"no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2\" href=\"\">\n    <div class=\"jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none\">\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none\" title=\"Repository\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none\" title=\"Project\" aria-label=\"Project\" viewBox=\"0 0 15 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none\" title=\"Search\" aria-label=\"Search\" viewBox=\"0 0 16 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\"/></svg>\n    </div>\n\n    <img class=\"avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none\" alt=\"\" aria-label=\"Team\" src=\"\" width=\"28\" height=\"28\">\n\n    <div class=\"jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target\">\n    </div>\n\n    <div class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search\">\n      <span class=\"js-jump-to-badge-search-text-default d-none\" aria-label=\"in this repository\">\n        In this repository\n      </span>\n      <span class=\"js-jump-to-badge-search-text-global d-none\" aria-label=\"in all of GitHub\">\n        All GitHub\n      </span>\n      <span aria-hidden=\"true\" class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n\n    <div aria-hidden=\"true\" class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump\">\n      Jump to\n      <span class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n  </a>\n</li>\n\n</ul>\n\n<ul class=\"d-none js-jump-to-no-results-template-container\">\n  <li class=\"d-flex flex-justify-center flex-items-center f5 d-none js-jump-to-suggestion p-2\">\n    <span class=\"text-gray\">No suggested jump to results</span>\n  </li>\n</ul>\n\n<ul id=\"jump-to-results\" role=\"listbox\" class=\"p-0 m-0 js-navigation-container jump-to-suggestions-results-container js-jump-to-suggestions-results-container\">\n  \n\n<li class=\"d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-scoped-search d-none\" role=\"option\">\n  <a tabindex=\"-1\" class=\"no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2\" href=\"\">\n    <div class=\"jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none\">\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none\" title=\"Repository\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none\" title=\"Project\" aria-label=\"Project\" viewBox=\"0 0 15 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none\" title=\"Search\" aria-label=\"Search\" viewBox=\"0 0 16 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\"/></svg>\n    </div>\n\n    <img class=\"avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none\" alt=\"\" aria-label=\"Team\" src=\"\" width=\"28\" height=\"28\">\n\n    <div class=\"jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target\">\n    </div>\n\n    <div class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search\">\n      <span class=\"js-jump-to-badge-search-text-default d-none\" aria-label=\"in this repository\">\n        In this repository\n      </span>\n      <span class=\"js-jump-to-badge-search-text-global d-none\" aria-label=\"in all of GitHub\">\n        All GitHub\n      </span>\n      <span aria-hidden=\"true\" class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n\n    <div aria-hidden=\"true\" class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump\">\n      Jump to\n      <span class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n  </a>\n</li>\n\n  \n\n<li class=\"d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-global-search d-none\" role=\"option\">\n  <a tabindex=\"-1\" class=\"no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2\" href=\"\">\n    <div class=\"jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none\">\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none\" title=\"Repository\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none\" title=\"Project\" aria-label=\"Project\" viewBox=\"0 0 15 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none\" title=\"Search\" aria-label=\"Search\" viewBox=\"0 0 16 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\"/></svg>\n    </div>\n\n    <img class=\"avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none\" alt=\"\" aria-label=\"Team\" src=\"\" width=\"28\" height=\"28\">\n\n    <div class=\"jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target\">\n    </div>\n\n    <div class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search\">\n      <span class=\"js-jump-to-badge-search-text-default d-none\" aria-label=\"in this repository\">\n        In this repository\n      </span>\n      <span class=\"js-jump-to-badge-search-text-global d-none\" aria-label=\"in all of GitHub\">\n        All GitHub\n      </span>\n      <span aria-hidden=\"true\" class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n\n    <div aria-hidden=\"true\" class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump\">\n      Jump to\n      <span class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n  </a>\n</li>\n\n\n</ul>\n\n            </div>\n      </label>\n</form>  </div>\n</div>\n\n          </div>\n\n        <a href=\"/login?return_to=%2Fheketi%2Fheketi%2Fblob%2Fmaster%2FLICENSE\"\n          class=\"HeaderMenu-link no-underline mr-3\"\n          data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;CC09:4D16:28C560:4E13B5:5E20F45C&quot;,&quot;originating_url&quot;:&quot;https://github.com/heketi/heketi/blob/master/LICENSE&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"c413fd5949d26e56db72e96be0182d961e328eeb0ff1020368507a62bafdd64b\"\n          data-ga-click=\"(Logged out) Header, clicked Sign in, text:sign-in\">\n          Sign&nbsp;in\n        </a>\n          <a href=\"/join?source=header-repo&amp;source_repo=heketi%2Fheketi\"\n            class=\"HeaderMenu-link d-inline-block no-underline border border-gray-dark rounded-1 px-2 py-1\"\n            data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;CC09:4D16:28C560:4E13B5:5E20F45C&quot;,&quot;originating_url&quot;:&quot;https://github.com/heketi/heketi/blob/master/LICENSE&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"c413fd5949d26e56db72e96be0182d961e328eeb0ff1020368507a62bafdd64b\"\n            data-ga-click=\"(Logged out) Header, clicked Sign up, text:sign-up\">\n            Sign&nbsp;up\n          </a>\n      </div>\n    </div>\n  </div>\n</header>\n\n  </div>\n\n  <div id=\"start-of-content\" class=\"show-on-focus\"></div>\n\n\n    <div id=\"js-flash-container\">\n\n</div>\n\n\n\n  <div class=\"application-main \" data-commit-hovercards-enabled>\n        <div itemscope itemtype=\"http://schema.org/SoftwareSourceCode\" class=\"\">\n    <main  >\n      \n\n\n  \n\n\n\n  \n\n\n\n\n\n\n\n\n\n  <div class=\" pagehead repohead readability-menu experiment-repo-nav pt-0 pt-lg-4 \">\n\n    <div class=\"container-lg mb-4 p-responsive d-none d-lg-flex\">\n\n      <div class=\"flex-auto min-width-0 width-fit mr-3\">\n        <h1 class=\"public  d-flex flex-wrap flex-items-center break-word float-none\">\n    <svg class=\"octicon octicon-repo mr-1\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n  <span class=\"author\" itemprop=\"author\">\n    <a class=\"url fn\" rel=\"author\" data-hovercard-type=\"organization\" data-hovercard-url=\"/orgs/heketi/hovercard\" href=\"/heketi\">heketi</a>\n  </span>\n  <span class=\"path-divider\">/</span>\n  <strong itemprop=\"name\" class=\"mr-2\">\n    <a data-pjax=\"#js-repo-pjax-container\" href=\"/heketi/heketi\">heketi</a>\n  </strong>\n  \n</h1>\n\n\n      </div>\n\n      <ul class=\"pagehead-actions flex-shrink-0\">\n\n\n\n\n  <li>\n    \n  <a class=\"tooltipped tooltipped-s btn btn-sm btn-with-count\" aria-label=\"You must be signed in to watch a repository\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;CC09:4D16:28C560:4E13B5:5E20F45C&quot;,&quot;originating_url&quot;:&quot;https://github.com/heketi/heketi/blob/master/LICENSE&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"2febcce79f848c7b0b537cd1c9b81ac9370fa8f54266c547cffdd418aafa4d6f\" href=\"/login?return_to=%2Fheketi%2Fheketi\">\n    <svg class=\"octicon octicon-eye v-align-text-bottom\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z\"/></svg>\n    Watch\n</a>    <a class=\"social-count\" href=\"/heketi/heketi/watchers\"\n       aria-label=\"56 users are watching this repository\">\n      56\n    </a>\n\n  </li>\n\n  <li>\n        <a class=\"btn btn-sm btn-with-count tooltipped tooltipped-s\" aria-label=\"You must be signed in to star a repository\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:37446835,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;CC09:4D16:28C560:4E13B5:5E20F45C&quot;,&quot;originating_url&quot;:&quot;https://github.com/heketi/heketi/blob/master/LICENSE&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"b80ecf6a442b1ec9d5e10f892ddb8bfa46f242c33997462d8612b5b6c462feb7\" href=\"/login?return_to=%2Fheketi%2Fheketi\">\n      <svg aria-label=\"star\" height=\"16\" class=\"octicon octicon-star v-align-text-bottom\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z\"/></svg>\n\n      Star\n</a>\n    <a class=\"social-count js-social-count\" href=\"/heketi/heketi/stargazers\"\n      aria-label=\"949 users starred this repository\">\n      949\n    </a>\n\n  </li>\n\n  <li>\n      <a class=\"btn btn-sm btn-with-count tooltipped tooltipped-s\" aria-label=\"You must be signed in to fork a repository\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:37446835,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;CC09:4D16:28C560:4E13B5:5E20F45C&quot;,&quot;originating_url&quot;:&quot;https://github.com/heketi/heketi/blob/master/LICENSE&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"0e0096423de68e688a19d01ab8a653c18b3049f100e33b238a1ebbcddef3f7aa\" href=\"/login?return_to=%2Fheketi%2Fheketi\">\n        <svg class=\"octicon octicon-repo-forked v-align-text-bottom\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 1a1.993 1.993 0 00-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 002 1a1.993 1.993 0 00-1 3.72V6.5l3 3v1.78A1.993 1.993 0 005 15a1.993 1.993 0 001-3.72V9.5l3-3V4.72A1.993 1.993 0 008 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"/></svg>\n        Fork\n</a>\n    <a href=\"/heketi/heketi/network/members\" class=\"social-count\"\n       aria-label=\"339 users forked this repository\">\n      339\n    </a>\n  </li>\n</ul>\n\n    </div>\n    \n<nav class=\"hx_reponav reponav js-repo-nav js-sidenav-container-pjax clearfix container-lg p-responsive d-none d-lg-block\"\n     itemscope\n     itemtype=\"http://schema.org/BreadcrumbList\"\n    aria-label=\"Repository\"\n     data-pjax=\"#js-repo-pjax-container\">\n\n  <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n    <a class=\"js-selected-navigation-item selected reponav-item\" itemprop=\"url\" data-hotkey=\"g c\" aria-current=\"page\" data-selected-links=\"repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /heketi/heketi\" href=\"/heketi/heketi\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-code\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9.5 3L8 4.5 11.5 8 8 11.5 9.5 13 14 8 9.5 3zm-5 0L0 8l4.5 5L6 11.5 2.5 8 6 4.5 4.5 3z\"/></svg></div>\n      <span itemprop=\"name\">Code</span>\n      <meta itemprop=\"position\" content=\"1\">\n</a>  </span>\n\n    <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n      <a itemprop=\"url\" data-hotkey=\"g i\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_issues repo_labels repo_milestones /heketi/heketi/issues\" href=\"/heketi/heketi/issues\">\n        <div class=\"d-inline\"><svg class=\"octicon octicon-issue-opened\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 011.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"/></svg></div>\n        <span itemprop=\"name\">Issues</span>\n        <span class=\"Counter\">53</span>\n        <meta itemprop=\"position\" content=\"2\">\n</a>    </span>\n\n\n  <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n    <a data-hotkey=\"g p\" data-skip-pjax=\"true\" itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_pulls checks /heketi/heketi/pulls\" href=\"/heketi/heketi/pulls\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-git-pull-request\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0010 15a1.993 1.993 0 001-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 00-1 3.72v6.56A1.993 1.993 0 002 15a1.993 1.993 0 001-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"/></svg></div>\n      <span itemprop=\"name\">Pull requests</span>\n      <span class=\"Counter\">7</span>\n      <meta itemprop=\"position\" content=\"4\">\n</a>  </span>\n\n\n    <a data-hotkey=\"g b\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_projects new_repo_project repo_project /heketi/heketi/projects\" href=\"/heketi/heketi/projects\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-project\" viewBox=\"0 0 15 16\" version=\"1.1\" width=\"15\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg></div>\n      Projects\n      <span class=\"Counter\" >1</span>\n</a>\n\n    <a class=\"js-selected-navigation-item reponav-item\" data-hotkey=\"g w\" data-selected-links=\"repo_wiki /heketi/heketi/wiki\" href=\"/heketi/heketi/wiki\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-book\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M3 5h4v1H3V5zm0 3h4V7H3v1zm0 2h4V9H3v1zm11-5h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm2-6v9c0 .55-.45 1-1 1H9.5l-1 1-1-1H2c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h5.5l1 1 1-1H15c.55 0 1 .45 1 1zm-8 .5L7.5 3H2v9h6V3.5zm7-.5H9.5l-.5.5V12h6V3z\"/></svg></div>\n      Wiki\n</a>\n    <a data-skip-pjax=\"true\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"security alerts policy token_scanning lgtm /heketi/heketi/security/advisories\" href=\"/heketi/heketi/security/advisories\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-shield\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M0 2l7-2 7 2v6.02C14 12.69 8.69 16 7 16c-1.69 0-7-3.31-7-7.98V2zm1 .75L7 1l6 1.75v5.268C13 12.104 8.449 15 7 15c-1.449 0-6-2.896-6-6.982V2.75zm1 .75L7 2v12c-1.207 0-5-2.482-5-5.985V3.5z\"/></svg></div>\n      Security\n</a>\n    <a class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_graphs repo_contributors dependency_graph pulse people /heketi/heketi/pulse\" href=\"/heketi/heketi/pulse\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-graph\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M16 14v1H0V0h1v14h15zM5 13H3V8h2v5zm4 0H7V3h2v10zm4 0h-2V6h2v7z\"/></svg></div>\n      Insights\n</a>\n\n</nav>\n\n  <div class=\"reponav-wrapper reponav-small d-lg-none\">\n  <nav class=\"reponav js-reponav text-center no-wrap\"\n       itemscope\n       itemtype=\"http://schema.org/BreadcrumbList\">\n\n    <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n      <a class=\"js-selected-navigation-item selected reponav-item\" itemprop=\"url\" aria-current=\"page\" data-selected-links=\"repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /heketi/heketi\" href=\"/heketi/heketi\">\n        <span itemprop=\"name\">Code</span>\n        <meta itemprop=\"position\" content=\"1\">\n</a>    </span>\n\n      <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n        <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_issues repo_labels repo_milestones /heketi/heketi/issues\" href=\"/heketi/heketi/issues\">\n          <span itemprop=\"name\">Issues</span>\n          <span class=\"Counter\">53</span>\n          <meta itemprop=\"position\" content=\"2\">\n</a>      </span>\n\n\n    <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n      <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_pulls checks /heketi/heketi/pulls\" href=\"/heketi/heketi/pulls\">\n        <span itemprop=\"name\">Pull requests</span>\n        <span class=\"Counter\">7</span>\n        <meta itemprop=\"position\" content=\"4\">\n</a>    </span>\n\n      <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n        <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_projects new_repo_project repo_project /heketi/heketi/projects\" href=\"/heketi/heketi/projects\">\n          <span itemprop=\"name\">Projects</span>\n          <span class=\"Counter\">1</span>\n          <meta itemprop=\"position\" content=\"5\">\n</a>      </span>\n\n      <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n        <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_wiki /heketi/heketi/wiki\" href=\"/heketi/heketi/wiki\">\n          <span itemprop=\"name\">Wiki</span>\n          <meta itemprop=\"position\" content=\"6\">\n</a>      </span>\n\n      <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"security alerts policy token_scanning lgtm /heketi/heketi/security/advisories\" href=\"/heketi/heketi/security/advisories\">\n        <span itemprop=\"name\">Security</span>\n        <meta itemprop=\"position\" content=\"7\">\n</a>\n      <a class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"pulse /heketi/heketi/pulse\" href=\"/heketi/heketi/pulse\">\n        Pulse\n</a>\n\n  </nav>\n</div>\n\n\n  </div>\n<div class=\"container-lg clearfix new-discussion-timeline experiment-repo-nav  p-responsive\">\n  <div class=\"repository-content \">\n\n    \n    \n\n\n  \n\n\n    <a class=\"d-none js-permalink-shortcut\" data-hotkey=\"y\" href=\"/heketi/heketi/blob/2e34455b6adf3615dd363529952ad8be41029a4e/LICENSE\">Permalink</a>\n\n    <!-- blob contrib key: blob_contributors:v21:0ea65b1c0859e72cb7a68382599a2d4c -->\n          <div class=\"signup-prompt-bg rounded-1\">\n      <div class=\"signup-prompt p-4 text-center mb-4 rounded-1\">\n        <div class=\"position-relative\">\n          <!-- '\"` --><!-- </textarea></xmp> --></option></form><form action=\"/prompt_dismissals/signup\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"_method\" value=\"put\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"2C+aOHDeV3Z+9+4mTwDND1ucLoOb30cBUpvxMeYNtI7aVRx/xQesrFeaA5EVW/uteZDqg48LOqst/1QsgQ+poA==\" />\n            <button type=\"submit\" class=\"position-absolute top-0 right-0 btn-link link-gray\" data-ga-click=\"(Logged out) Sign up prompt, clicked Dismiss, text:dismiss\">\n              Dismiss\n            </button>\n</form>          <h3 class=\"pt-2\">Join GitHub today</h3>\n          <p class=\"col-6 mx-auto\">GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.</p>\n          <a class=\"btn btn-primary\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;files signup prompt&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;CC09:4D16:28C560:4E13B5:5E20F45C&quot;,&quot;originating_url&quot;:&quot;https://github.com/heketi/heketi/blob/master/LICENSE&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"7e050e8c44545d6274ce255d31c7a73c513eaa6b6ac2c3dbb2696e0b7bb3bee1\" data-ga-click=\"(Logged out) Sign up prompt, clicked Sign up, text:sign-up\" href=\"/join?source=prompt-blob-show&amp;source_repo=heketi%2Fheketi\">Sign up</a>\n        </div>\n      </div>\n    </div>\n\n\n    <div class=\"d-flex flex-items-start flex-shrink-0 pb-3 flex-column flex-md-row\">\n      <span class=\"d-flex flex-justify-between width-full width-md-auto\">\n        \n<details class=\"details-reset details-overlay select-menu branch-select-menu  hx_rsm\" id=\"branch-select-menu\">\n  <summary class=\"btn btn-sm select-menu-button css-truncate\"\n           data-hotkey=\"w\"\n           title=\"Switch branches or tags\">\n    <i>Branch:</i>\n    <span class=\"css-truncate-target\" data-menu-button>master</span>\n  </summary>\n\n  <details-menu class=\"select-menu-modal hx_rsm-modal position-absolute\" style=\"z-index: 99;\" src=\"/heketi/heketi/refs/master/LICENSE?source_action=show&amp;source_controller=blob\" preload>\n    <include-fragment class=\"select-menu-loading-overlay anim-pulse\">\n      <svg height=\"32\" class=\"octicon octicon-octoface\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"32\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M14.7 5.34c.13-.32.55-1.59-.13-3.31 0 0-1.05-.33-3.44 1.3-1-.28-2.07-.32-3.13-.32s-2.13.04-3.13.32c-2.39-1.64-3.44-1.3-3.44-1.3-.68 1.72-.26 2.99-.13 3.31C.49 6.21 0 7.33 0 8.69 0 13.84 3.33 15 7.98 15S16 13.84 16 8.69c0-1.36-.49-2.48-1.3-3.35zM8 14.02c-3.3 0-5.98-.15-5.98-3.35 0-.76.38-1.48 1.02-2.07 1.07-.98 2.9-.46 4.96-.46 2.07 0 3.88-.52 4.96.46.65.59 1.02 1.3 1.02 2.07 0 3.19-2.68 3.35-5.98 3.35zM5.49 9.01c-.66 0-1.2.8-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.54-1.78-1.2-1.78zm5.02 0c-.66 0-1.2.79-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.53-1.78-1.2-1.78z\"/></svg>\n    </include-fragment>\n  </details-menu>\n</details>\n\n        <div class=\"BtnGroup flex-shrink-0 d-md-none\">\n          <a href=\"/heketi/heketi/find/master\"\n                class=\"js-pjax-capture-input btn btn-sm BtnGroup-item\"\n                data-pjax\n                data-hotkey=\"t\">\n            Find file\n          </a>\n          <clipboard-copy value=\"LICENSE\" class=\"btn btn-sm BtnGroup-item\">\n            Copy path\n          </clipboard-copy>\n        </div>\n      </span>\n      <h2 id=\"blob-path\" class=\"breadcrumb flex-auto min-width-0 text-normal flex-md-self-center ml-md-2 mr-md-3 my-2 my-md-0\">\n        <span class=\"js-repo-root text-bold\"><span class=\"js-path-segment\"><a data-pjax=\"true\" href=\"/heketi/heketi\"><span>heketi</span></a></span></span><span class=\"separator\">/</span><strong class=\"final-path\">LICENSE</strong>\n      </h2>\n\n      <div class=\"BtnGroup flex-shrink-0 d-none d-md-inline-block\">\n        <a href=\"/heketi/heketi/find/master\"\n              class=\"js-pjax-capture-input btn btn-sm BtnGroup-item\"\n              data-pjax\n              data-hotkey=\"t\">\n          Find file\n        </a>\n        <clipboard-copy value=\"LICENSE\" class=\"btn btn-sm BtnGroup-item\">\n          Copy path\n        </clipboard-copy>\n      </div>\n    </div>\n\n    \n\n\n\n    <include-fragment src=\"/heketi/heketi/contributors/master/LICENSE\" class=\"Box Box--condensed commit-loader\">\n      <div class=\"Box-body bg-blue-light f6\">\n        Fetching contributors&hellip;\n      </div>\n\n      <div class=\"Box-body d-flex flex-items-center\" >\n          <img alt=\"\" class=\"loader-loading mr-2\" src=\"https://github.githubassets.com/images/spinners/octocat-spinner-32-EAF2F5.gif\" width=\"16\" height=\"16\" />\n        <span class=\"text-red h6 loader-error\">Cannot retrieve contributors at this time</span>\n      </div>\n</include-fragment>\n\n\n\n\n    <div class=\"Box mt-3 position-relative\">\n      \n<div class=\"Box-header py-2 d-flex flex-column flex-shrink-0 flex-md-row flex-md-items-center\">\n  <div class=\"text-mono f6 flex-auto pr-3 flex-order-2 flex-md-order-1 mt-2 mt-md-0\">\n\n      7 lines (5 sloc)\n      <span class=\"file-info-divider\"></span>\n    260 Bytes\n  </div>\n\n  <div class=\"d-flex py-1 py-md-0 flex-auto flex-order-1 flex-md-order-2 flex-sm-grow-0 flex-justify-between\">\n\n    <div class=\"BtnGroup\">\n      <a id=\"raw-url\" class=\"btn btn-sm BtnGroup-item\" href=\"/heketi/heketi/raw/master/LICENSE\">Raw</a>\n        <a class=\"btn btn-sm js-update-url-with-hash BtnGroup-item\" data-hotkey=\"b\" href=\"/heketi/heketi/blame/master/LICENSE\">Blame</a>\n      <a rel=\"nofollow\" class=\"btn btn-sm BtnGroup-item\" href=\"/heketi/heketi/commits/master/LICENSE\">History</a>\n    </div>\n\n\n    <div>\n\n          <button type=\"button\" class=\"btn-octicon disabled tooltipped tooltipped-nw\"\n            aria-label=\"You must be signed in to make or propose changes\">\n            <svg class=\"octicon octicon-pencil\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M0 12v3h3l8-8-3-3-8 8zm3 2H1v-2h1v1h1v1zm10.3-9.3L12 6 9 3l1.3-1.3a.996.996 0 011.41 0l1.59 1.59c.39.39.39 1.02 0 1.41z\"/></svg>\n          </button>\n          <button type=\"button\" class=\"btn-octicon btn-octicon-danger disabled tooltipped tooltipped-nw\"\n            aria-label=\"You must be signed in to make or propose changes\">\n            <svg class=\"octicon octicon-trashcan\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 2H9c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1H2c-.55 0-1 .45-1 1v1c0 .55.45 1 1 1v9c0 .55.45 1 1 1h7c.55 0 1-.45 1-1V5c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm-1 12H3V5h1v8h1V5h1v8h1V5h1v8h1V5h1v9zm1-10H2V3h9v1z\"/></svg>\n          </button>\n    </div>\n  </div>\n</div>\n\n\n\n\n      \n\n  <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-text \">\n      \n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\">\n      <tr>\n        <td id=\"L1\" class=\"blob-num js-line-number\" data-line-number=\"1\"></td>\n        <td id=\"LC1\" class=\"blob-code blob-code-inner js-file-line\">Heketi code is released under various licenses:</td>\n      </tr>\n      <tr>\n        <td id=\"L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"></td>\n        <td id=\"LC2\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"></td>\n        <td id=\"LC3\" class=\"blob-code blob-code-inner js-file-line\">The REST API client code (in go and python) is released</td>\n      </tr>\n      <tr>\n        <td id=\"L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"></td>\n        <td id=\"LC4\" class=\"blob-code blob-code-inner js-file-line\">under a dual license of Apache 2.0 or LGPLv3+.</td>\n      </tr>\n      <tr>\n        <td id=\"L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"></td>\n        <td id=\"LC5\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"></td>\n        <td id=\"LC6\" class=\"blob-code blob-code-inner js-file-line\">The other parts of heketi (server, cli, tests, ...) are released</td>\n      </tr>\n      <tr>\n        <td id=\"L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"></td>\n        <td id=\"LC7\" class=\"blob-code blob-code-inner js-file-line\">under a dual license of LGPLv3+ or GPLv2.</td>\n      </tr>\n</table>\n\n  <details class=\"details-reset details-overlay BlobToolbar position-absolute js-file-line-actions dropdown d-none\" aria-hidden=\"true\">\n    <summary class=\"btn-octicon ml-0 px-2 p-0 bg-white border border-gray-dark rounded-1\" aria-label=\"Inline file action toolbar\">\n      <svg class=\"octicon octicon-kebab-horizontal\" viewBox=\"0 0 13 16\" version=\"1.1\" width=\"13\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm5 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM13 7.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z\"/></svg>\n    </summary>\n    <details-menu>\n      <ul class=\"BlobToolbar-dropdown dropdown-menu dropdown-menu-se mt-2\" style=\"width:185px\">\n        <li>\n          <clipboard-copy role=\"menuitem\" class=\"dropdown-item\" id=\"js-copy-lines\" style=\"cursor:pointer;\">\n            Copy lines\n          </clipboard-copy>\n        </li>\n        <li>\n          <clipboard-copy role=\"menuitem\" class=\"dropdown-item\" id=\"js-copy-permalink\" style=\"cursor:pointer;\">\n            Copy permalink\n          </clipboard-copy>\n        </li>\n        <li><a class=\"dropdown-item js-update-url-with-hash\" id=\"js-view-git-blame\" role=\"menuitem\" href=\"/heketi/heketi/blame/2e34455b6adf3615dd363529952ad8be41029a4e/LICENSE\">View git blame</a></li>\n          <li><a class=\"dropdown-item\" id=\"js-new-issue\" role=\"menuitem\" href=\"/heketi/heketi/issues/new\">Reference in new issue</a></li>\n      </ul>\n    </details-menu>\n  </details>\n\n  </div>\n\n    </div>\n\n  \n\n  <details class=\"details-reset details-overlay details-overlay-dark\">\n    <summary data-hotkey=\"l\" aria-label=\"Jump to line\"></summary>\n    <details-dialog class=\"Box Box--overlay d-flex flex-column anim-fade-in fast linejump\" aria-label=\"Jump to line\">\n      <!-- '\"` --><!-- </textarea></xmp> --></option></form><form class=\"js-jump-to-line-form Box-body d-flex\" action=\"\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" />\n        <input class=\"form-control flex-auto mr-3 linejump-input js-jump-to-line-field\" type=\"text\" placeholder=\"Jump to line&hellip;\" aria-label=\"Jump to line\" autofocus>\n        <button type=\"submit\" class=\"btn\" data-close-dialog>Go</button>\n</form>    </details-dialog>\n  </details>\n\n\n\n  </div>\n</div>\n\n    </main>\n  </div>\n  \n\n  </div>\n\n        \n<div class=\"footer container-lg width-full p-responsive\" role=\"contentinfo\">\n  <div class=\"position-relative d-flex flex-row-reverse flex-lg-row flex-wrap flex-lg-nowrap flex-justify-center flex-lg-justify-between pt-6 pb-2 mt-6 f6 text-gray border-top border-gray-light \">\n    <ul class=\"list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0\">\n      <li class=\"mr-3 mr-lg-0\">&copy; 2020 GitHub, Inc.</li>\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to terms, text:terms\" href=\"https://github.com/site/terms\">Terms</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to privacy, text:privacy\" href=\"https://github.com/site/privacy\">Privacy</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to security, text:security\" href=\"https://github.com/security\">Security</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a href=\"https://githubstatus.com/\" data-ga-click=\"Footer, go to status, text:status\">Status</a></li>\n        <li><a data-ga-click=\"Footer, go to help, text:help\" href=\"https://help.github.com\">Help</a></li>\n    </ul>\n\n    <a aria-label=\"Homepage\" title=\"GitHub\" class=\"footer-octicon d-none d-lg-block mx-lg-4\" href=\"https://github.com\">\n      <svg height=\"24\" class=\"octicon octicon-mark-github\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"24\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"/></svg>\n</a>\n   <ul class=\"list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0\">\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to contact, text:contact\" href=\"https://github.com/contact\">Contact GitHub</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a href=\"https://github.com/pricing\" data-ga-click=\"Footer, go to Pricing, text:Pricing\">Pricing</a></li>\n      <li class=\"mr-3 mr-lg-0\"><a href=\"https://developer.github.com\" data-ga-click=\"Footer, go to api, text:api\">API</a></li>\n      <li class=\"mr-3 mr-lg-0\"><a href=\"https://training.github.com\" data-ga-click=\"Footer, go to training, text:training\">Training</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a href=\"https://github.blog\" data-ga-click=\"Footer, go to blog, text:blog\">Blog</a></li>\n        <li><a data-ga-click=\"Footer, go to about, text:about\" href=\"https://github.com/about\">About</a></li>\n\n    </ul>\n  </div>\n  <div class=\"d-flex flex-justify-center pb-6\">\n    <span class=\"f6 text-gray-light\"></span>\n  </div>\n</div>\n\n\n\n  <div id=\"ajax-error-message\" class=\"ajax-error-message flash flash-error\">\n    <svg class=\"octicon octicon-alert\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 000 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 00.01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"/></svg>\n    <button type=\"button\" class=\"flash-close js-ajax-error-dismiss\" aria-label=\"Dismiss error\">\n      <svg class=\"octicon octicon-x\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"/></svg>\n    </button>\n    You can’t perform that action at this time.\n  </div>\n\n\n    <script crossorigin=\"anonymous\" integrity=\"sha512-mdrBasYG+QjgS391PSyVkPr06io3gWplCVbPscguetNEHxIEt+mZwCeCxPR9eMNfda6qNuibNFqBo5ak2+O/hg==\" type=\"application/javascript\" src=\"https://github.githubassets.com/assets/compat-bootstrap-99dac16a.js\"></script>\n    <script crossorigin=\"anonymous\" integrity=\"sha512-/VSJJF96vCzSgC6y09Z4FqzjjuXRWOKIq2twF0Nb5/v8xy4qzngnH6Au6TFwbmNN/lborYJsojEpgIbYjoGvHQ==\" type=\"application/javascript\" src=\"https://github.githubassets.com/assets/frameworks-fd548924.js\"></script>\n    \n    <script crossorigin=\"anonymous\" async=\"async\" integrity=\"sha512-m5yUV1k2rIlsiXzuekXmQRaGOGWxP1UsTTiDsWuhrYGi3pDU0B0chnrznxqNjPrc1I6egRU9k9i8XT581R7nPw==\" type=\"application/javascript\" src=\"https://github.githubassets.com/assets/github-bootstrap-9b9c9457.js\"></script>\n    \n    \n    \n  <div class=\"js-stale-session-flash flash flash-warn flash-banner\" hidden\n    >\n    <svg class=\"octicon octicon-alert\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 000 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 00.01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"/></svg>\n    <span class=\"js-stale-session-flash-signed-in\" hidden>You signed in with another tab or window. <a href=\"\">Reload</a> to refresh your session.</span>\n    <span class=\"js-stale-session-flash-signed-out\" hidden>You signed out in another tab or window. <a href=\"\">Reload</a> to refresh your session.</span>\n  </div>\n  <template id=\"site-details-dialog\">\n  <details class=\"details-reset details-overlay details-overlay-dark lh-default text-gray-dark hx_rsm\" open>\n    <summary role=\"button\" aria-label=\"Close dialog\"></summary>\n    <details-dialog class=\"Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal\">\n      <button class=\"Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0\" type=\"button\" aria-label=\"Close dialog\" data-close-dialog>\n        <svg class=\"octicon octicon-x\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"/></svg>\n      </button>\n      <div class=\"octocat-spinner my-6 js-details-dialog-spinner\"></div>\n    </details-dialog>\n  </details>\n</template>\n\n  <div class=\"Popover js-hovercard-content position-absolute\" style=\"display: none; outline: none;\" tabindex=\"0\">\n  <div class=\"Popover-message Popover-message--bottom-left Popover-message--large Box box-shadow-large\" style=\"width:360px;\">\n  </div>\n</div>\n\n  <div aria-live=\"polite\" class=\"js-global-screen-reader-notice sr-only\"></div>\n\n  </body>\n</html>\n\n\n--------------------------------------------------------------------------------\nkr/logfmt  MIT License  https://github.com/kr/logfmt/blob/master/Readme\n--------------------------------------------------------------------------------\n\n\n\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars0.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars1.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars2.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars3.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-hddDYPWR0gBbqLRmIZP242WMEiYsVkYI2UCYCVUHB4h5DhD2cbtFJYG+HPh21dZGb+sbgDHxQBNJCBq7YbmlBQ==\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/frameworks-02a3eaa24db2bd1ed9b64450595fc2cf.css\" />\n  <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-zWr4N1VWM8vyTn58rsleo3nkt4rOaqbF4yOqvpy2fJvUoZeG6baCy/xLXQ/Y8PLBzpQVg+UTbEmOLl+OI6tr+g==\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/site-0a9510c049d01c51f42259bdf49696be.css\" />\n    <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-/cDjVH+IaE87Rpuj2/qVqKm34ivtGXaGNQO78KB3QyXnu9KzhlVymfEv5eMg7kpqaDcyelwZDvppJ1QAbRTADQ==\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/github-7cd9be2691657ef30a01b0fb565df9f2.css\" />\n    \n    \n    \n    \n\n\n  <meta name=\"viewport\" content=\"width=device-width\">\n  \n  <title>logfmt/Readme at master · kr/logfmt · GitHub</title>\n    <meta name=\"description\" content=\"Parse logfmt messages. Contribute to kr/logfmt development by creating an account on GitHub.\">\n    <link rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"/opensearch.xml\" title=\"GitHub\">\n  <link rel=\"fluid-icon\" href=\"https://github.com/fluidicon.png\" title=\"GitHub\">\n  <meta property=\"fb:app_id\" content=\"1401488693436528\">\n\n    <meta name=\"twitter:image:src\" content=\"https://avatars1.githubusercontent.com/u/4178?s=400&amp;v=4\" /><meta name=\"twitter:site\" content=\"@github\" /><meta name=\"twitter:card\" content=\"summary\" /><meta name=\"twitter:title\" content=\"kr/logfmt\" /><meta name=\"twitter:description\" content=\"Parse logfmt messages. Contribute to kr/logfmt development by creating an account on GitHub.\" />\n    <meta property=\"og:image\" content=\"https://avatars1.githubusercontent.com/u/4178?s=400&amp;v=4\" /><meta property=\"og:site_name\" content=\"GitHub\" /><meta property=\"og:type\" content=\"object\" /><meta property=\"og:title\" content=\"kr/logfmt\" /><meta property=\"og:url\" content=\"https://github.com/kr/logfmt\" /><meta property=\"og:description\" content=\"Parse logfmt messages. Contribute to kr/logfmt development by creating an account on GitHub.\" />\n\n  <link rel=\"assets\" href=\"https://github.githubassets.com/\">\n  \n  \n\n    <meta name=\"request-id\" content=\"8F0B:627C:263BF7:496F61:5E20F45D\" data-pjax-transient>\n\n\n\n  \n\n  <meta name=\"selected-link\" value=\"repo_source\" data-pjax-transient>\n\n      <meta name=\"google-site-verification\" content=\"KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r1XQysX3xurLU\">\n    <meta name=\"google-site-verification\" content=\"ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVihD0exw2fsA\">\n    <meta name=\"google-site-verification\" content=\"GXs5KoUUkNCoaAZn7wPN-t01Pywp9M3sEjnt_3_ZWPc\">\n\n    <meta name=\"octolytics-host\" content=\"collector.githubapp.com\" /><meta name=\"octolytics-app-id\" content=\"github\" /><meta name=\"octolytics-event-url\" content=\"https://collector.githubapp.com/github-external/browser_event\" /><meta name=\"octolytics-dimension-request_id\" content=\"8F0B:627C:263BF7:496F61:5E20F45D\" /><meta name=\"octolytics-dimension-region_edge\" content=\"iad\" /><meta name=\"octolytics-dimension-region_render\" content=\"iad\" /><meta name=\"octolytics-dimension-ga_id\" content=\"\" class=\"js-octo-ga-id\" /><meta name=\"octolytics-dimension-visitor_id\" content=\"5380112723606565981\" />\n\n<meta name=\"analytics-location\" content=\"/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show\" data-pjax-transient=\"true\" />\n\n\n\n    <meta name=\"google-analytics\" content=\"UA-3769691-2\">\n\n\n<meta class=\"js-ga-set\" name=\"dimension1\" content=\"Logged Out\">\n\n\n\n  \n\n      <meta name=\"hostname\" content=\"github.com\">\n    <meta name=\"user-login\" content=\"\">\n\n      <meta name=\"expected-hostname\" content=\"github.com\">\n\n      <meta name=\"js-proxy-site-detection-payload\" content=\"OGQ2ZjQ4NzNiMGJmZTA0MjExYzc3OTNiZDhmNzkyNWRhNzlmM2YyMGRhN2E1OTA2ZDc1ZDgyZTAwNmJlNjMwOHx7InJlbW90ZV9hZGRyZXNzIjoiMTA0LjEzMy45LjcwIiwicmVxdWVzdF9pZCI6IjhGMEI6NjI3QzoyNjNCRjc6NDk2RjYxOjVFMjBGNDVEIiwidGltZXN0YW1wIjoxNTc5MjE4MDEzLCJob3N0IjoiZ2l0aHViLmNvbSJ9\">\n\n    <meta name=\"enabled-features\" content=\"MARKETPLACE_FEATURED_BLOG_POSTS,MARKETPLACE_INVOICED_BILLING,MARKETPLACE_SOCIAL_PROOF_CUSTOMERS,MARKETPLACE_TRENDING_SOCIAL_PROOF,MARKETPLACE_RECOMMENDATIONS,MARKETPLACE_PENDING_INSTALLATIONS\">\n\n    <meta name=\"html-safe-nonce\" content=\"ee99d82050cee7a2e69f7b563c36f60a0f458ef9\">\n\n  <meta http-equiv=\"x-pjax-version\" content=\"5e0094cbbb771240ede4fb72730ad954\">\n  \n\n      <link href=\"https://github.com/kr/logfmt/commits/master.atom\" rel=\"alternate\" title=\"Recent Commits to logfmt:master\" type=\"application/atom+xml\">\n\n  <meta name=\"go-import\" content=\"github.com/kr/logfmt git https://github.com/kr/logfmt.git\">\n\n  <meta name=\"octolytics-dimension-user_id\" content=\"4178\" /><meta name=\"octolytics-dimension-user_login\" content=\"kr\" /><meta name=\"octolytics-dimension-repository_id\" content=\"6713416\" /><meta name=\"octolytics-dimension-repository_nwo\" content=\"kr/logfmt\" /><meta name=\"octolytics-dimension-repository_public\" content=\"true\" /><meta name=\"octolytics-dimension-repository_is_fork\" content=\"false\" /><meta name=\"octolytics-dimension-repository_network_root_id\" content=\"6713416\" /><meta name=\"octolytics-dimension-repository_network_root_nwo\" content=\"kr/logfmt\" /><meta name=\"octolytics-dimension-repository_explore_github_marketplace_ci_cta_shown\" content=\"false\" />\n\n\n    <link rel=\"canonical\" href=\"https://github.com/kr/logfmt/blob/master/Readme\" data-pjax-transient>\n\n\n  <meta name=\"browser-stats-url\" content=\"https://api.github.com/_private/browser/stats\">\n\n  <meta name=\"browser-errors-url\" content=\"https://api.github.com/_private/browser/errors\">\n\n  <link rel=\"mask-icon\" href=\"https://github.githubassets.com/pinned-octocat.svg\" color=\"#000000\">\n  <link rel=\"icon\" type=\"image/x-icon\" class=\"js-site-favicon\" href=\"https://github.githubassets.com/favicon.ico\">\n\n<meta name=\"theme-color\" content=\"#1e2327\">\n\n\n  <link rel=\"manifest\" href=\"/manifest.json\" crossOrigin=\"use-credentials\">\n\n  </head>\n\n  <body class=\"logged-out env-production page-responsive page-blob\">\n    \n\n  <div class=\"position-relative js-header-wrapper \">\n    <a href=\"#start-of-content\" tabindex=\"1\" class=\"px-2 py-4 bg-blue text-white show-on-focus js-skip-to-content\">Skip to content</a>\n    <span class=\"Progress progress-pjax-loader position-fixed width-full js-pjax-loader-bar\">\n      <span class=\"progress-pjax-loader-bar top-0 left-0\" style=\"width: 0%;\"></span>\n    </span>\n\n    \n    \n    \n\n\n        <header class=\"Header-old header-logged-out js-details-container Details position-relative f4 py-2\" role=\"banner\">\n  <div class=\"container-lg d-lg-flex flex-items-center p-responsive\">\n    <div class=\"d-flex flex-justify-between flex-items-center\">\n        <a class=\"mr-4\" href=\"https://github.com/\" aria-label=\"Homepage\" data-ga-click=\"(Logged out) Header, go to homepage, icon:logo-wordmark\">\n          <svg height=\"32\" class=\"octicon octicon-mark-github text-white\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"32\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"/></svg>\n        </a>\n\n          <div class=\"d-lg-none css-truncate css-truncate-target width-fit p-2\">\n            \n              <svg class=\"octicon octicon-repo\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n    <a class=\"Header-link\" href=\"/kr\">kr</a>\n    /\n    <a class=\"Header-link\" href=\"/kr/logfmt\">logfmt</a>\n\n\n          </div>\n\n        <div class=\"d-flex flex-items-center\">\n            <a href=\"/join?source=header-repo\"\n              class=\"d-inline-block d-lg-none f5 text-white no-underline border border-gray-dark rounded-2 px-2 py-1 mr-3 mr-sm-5\"\n              data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;8F0B:627C:263BF7:496F61:5E20F45D&quot;,&quot;originating_url&quot;:&quot;https://github.com/kr/logfmt/blob/master/Readme&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"c4cdbba00f77818dd1f8345d1c9270f7016a0dddab129510f4029db8f847efdb\"\n              data-ga-click=\"(Logged out) Header, clicked Sign up, text:sign-up\">\n              Sign&nbsp;up\n            </a>\n\n          <button class=\"btn-link d-lg-none mt-1 js-details-target\" type=\"button\" aria-label=\"Toggle navigation\" aria-expanded=\"false\">\n            <svg height=\"24\" class=\"octicon octicon-three-bars text-white\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"18\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.41 9H.59C0 9 0 8.59 0 8c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zm0-4H.59C0 5 0 4.59 0 4c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zM.59 11H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1H.59C0 13 0 12.59 0 12c0-.59 0-1 .59-1z\"/></svg>\n          </button>\n        </div>\n    </div>\n\n    <div class=\"HeaderMenu HeaderMenu--logged-out position-fixed top-0 right-0 bottom-0 height-fit position-lg-relative d-lg-flex flex-justify-between flex-items-center flex-auto\">\n      <div class=\"d-flex d-lg-none flex-justify-end border-bottom bg-gray-light p-3\">\n        <button class=\"btn-link js-details-target\" type=\"button\" aria-label=\"Toggle navigation\" aria-expanded=\"false\">\n          <svg height=\"24\" class=\"octicon octicon-x text-gray\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"18\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"/></svg>\n        </button>\n      </div>\n\n        <nav class=\"mt-0 px-3 px-lg-0 mb-5 mb-lg-0\" aria-label=\"Global\">\n          <ul class=\"d-lg-flex list-style-none\">\n              <li class=\"d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center \">\n                <details class=\"HeaderMenu-details details-overlay details-reset width-full\">\n                  <summary class=\"HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block\">\n                    Why GitHub?\n                    <svg x=\"0px\" y=\"0px\" viewBox=\"0 0 14 8\" xml:space=\"preserve\" fill=\"none\" class=\"icon-chevon-down-mktg position-absolute position-lg-relative\">\n                      <path d=\"M1,1l6.2,6L13,1\"></path>\n                    </svg>\n                  </summary>\n                  <div class=\"dropdown-menu flex-auto rounded-1 bg-white px-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4\">\n                    <a href=\"/features\" class=\"py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Features\">Features <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a>\n                    <ul class=\"list-style-none f5 pb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/features/code-review/\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Code review\">Code review</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/project-management/\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Project management\">Project management</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/integrations\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Integrations\">Integrations</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/actions\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Actions\">Actions</a></li>\n                          <li class=\"edge-item-fix\"><a href=\"/features/packages\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to GitHub Packages\">Packages</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features/security\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Security\">Security</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features#team-management\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Team management\">Team management</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/features#hosting\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Code hosting\">Hosting</a></li>\n                    </ul>\n\n                    <ul class=\"list-style-none mb-0 border-lg-top pt-lg-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/customer-stories\" class=\"py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Customer stories\">Customer stories <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/security\" class=\"py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Security\">Security <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                    </ul>\n                  </div>\n                </details>\n              </li>\n              <li class=\"border-bottom border-lg-bottom-0 mr-0 mr-lg-3\">\n                <a href=\"/enterprise\" class=\"HeaderMenu-link no-underline py-3 d-block d-lg-inline-block\" data-ga-click=\"(Logged out) Header, go to Enterprise\">Enterprise</a>\n              </li>\n\n              <li class=\"d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center \">\n                <details class=\"HeaderMenu-details details-overlay details-reset width-full\">\n                  <summary class=\"HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block\">\n                    Explore\n                    <svg x=\"0px\" y=\"0px\" viewBox=\"0 0 14 8\" xml:space=\"preserve\" fill=\"none\" class=\"icon-chevon-down-mktg position-absolute position-lg-relative\">\n                      <path d=\"M1,1l6.2,6L13,1\"></path>\n                    </svg>\n                  </summary>\n\n                  <div class=\"dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4\">\n                    <ul class=\"list-style-none mb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/explore\" class=\"py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Explore\">Explore GitHub <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                    </ul>\n\n                    <h4 class=\"text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3\">Learn &amp; contribute</h4>\n                    <ul class=\"list-style-none mb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/topics\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Topics\">Topics</a></li>\n                        <li class=\"edge-item-fix\"><a href=\"/collections\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Collections\">Collections</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"/trending\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Trending\">Trending</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://lab.github.com/\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Learning lab\">Learning Lab</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://opensource.guide\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Open source guides\">Open source guides</a></li>\n                    </ul>\n\n                    <h4 class=\"text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3\">Connect with others</h4>\n                    <ul class=\"list-style-none mb-0\">\n                      <li class=\"edge-item-fix\"><a href=\"https://github.com/events\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Events\">Events</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://github.community\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Community forum\">Community forum</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://education.github.com\" class=\"py-2 pb-0 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to GitHub Education\">GitHub Education</a></li>\n                    </ul>\n                  </div>\n                </details>\n              </li>\n\n              <li class=\"border-bottom border-lg-bottom-0 mr-0 mr-lg-3\">\n                <a href=\"/marketplace\" class=\"HeaderMenu-link no-underline py-3 d-block d-lg-inline-block\" data-ga-click=\"(Logged out) Header, go to Marketplace\">Marketplace</a>\n              </li>\n\n              <li class=\"d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center \">\n                <details class=\"HeaderMenu-details details-overlay details-reset width-full\">\n                  <summary class=\"HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block\">\n                    Pricing\n                    <svg x=\"0px\" y=\"0px\" viewBox=\"0 0 14 8\" xml:space=\"preserve\" fill=\"none\" class=\"icon-chevon-down-mktg position-absolute position-lg-relative\">\n                       <path d=\"M1,1l6.2,6L13,1\"></path>\n                    </svg>\n                  </summary>\n\n                  <div class=\"dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-4 mt-0 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4\">\n                    <a href=\"/pricing\" class=\"pb-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Pricing\">Plans <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a>\n\n                    <ul class=\"list-style-none mb-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/pricing#feature-comparison\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Compare plans\">Compare plans</a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://enterprise.github.com/contact\" class=\"py-2 lh-condensed-ultra d-block link-gray no-underline f5\" data-ga-click=\"(Logged out) Header, go to Contact Sales\">Contact Sales</a></li>\n                    </ul>\n\n                    <ul class=\"list-style-none mb-0 border-lg-top pt-lg-3\">\n                      <li class=\"edge-item-fix\"><a href=\"/nonprofit\" class=\"py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\" data-ga-click=\"(Logged out) Header, go to Nonprofits\">Nonprofit <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                      <li class=\"edge-item-fix\"><a href=\"https://education.github.com\" class=\"py-2 pb-0 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover\"  data-ga-click=\"(Logged out) Header, go to Education\">Education <span class=\"Bump-link-symbol float-right text-normal text-gray-light\">&rarr;</span></a></li>\n                    </ul>\n                  </div>\n                </details>\n              </li>\n          </ul>\n        </nav>\n\n      <div class=\"d-lg-flex flex-items-center px-3 px-lg-0 text-center text-lg-left\">\n          <div class=\"d-lg-flex mb-3 mb-lg-0\">\n            <div class=\"header-search flex-self-stretch flex-lg-self-auto mr-0 mr-lg-3 mb-3 mb-lg-0 scoped-search site-scoped-search js-site-search position-relative js-jump-to\"\n  role=\"combobox\"\n  aria-owns=\"jump-to-results\"\n  aria-label=\"Search or jump to\"\n  aria-haspopup=\"listbox\"\n  aria-expanded=\"false\"\n>\n  <div class=\"position-relative\">\n    <!-- '\"` --><!-- </textarea></xmp> --></option></form><form class=\"js-site-search-form\" role=\"search\" aria-label=\"Site\" data-scope-type=\"Repository\" data-scope-id=\"6713416\" data-scoped-search-url=\"/kr/logfmt/search\" data-unscoped-search-url=\"/search\" action=\"/kr/logfmt/search\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" />\n      <label class=\"form-control input-sm header-search-wrapper p-0 header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center js-chromeless-input-container\">\n        <input type=\"text\"\n          class=\"form-control input-sm header-search-input jump-to-field js-jump-to-field js-site-search-focus js-site-search-field is-clearable\"\n          data-hotkey=\"s,/\"\n          name=\"q\"\n          value=\"\"\n          placeholder=\"Search\"\n          data-unscoped-placeholder=\"Search GitHub\"\n          data-scoped-placeholder=\"Search\"\n          autocapitalize=\"off\"\n          aria-autocomplete=\"list\"\n          aria-controls=\"jump-to-results\"\n          aria-label=\"Search\"\n          data-jump-to-suggestions-path=\"/_graphql/GetSuggestedNavigationDestinations#csrf-token=JUG5k0p7yawejW3lUYvb8sMJMbsCzpCcGiokKc5tG85zhUQzytYgJ3fR6UKjyiT5N26Sre1xsr3x5ilZbKE9UA==\"\n          spellcheck=\"false\"\n          autocomplete=\"off\"\n          >\n          <input type=\"hidden\" class=\"js-site-search-type-field\" name=\"type\" >\n            <img src=\"https://github.githubassets.com/images/search-key-slash.svg\" alt=\"\" class=\"mr-2 header-search-key-slash\">\n\n            <div class=\"Box position-absolute overflow-hidden d-none jump-to-suggestions js-jump-to-suggestions-container\">\n              \n<ul class=\"d-none js-jump-to-suggestions-template-container\">\n  \n\n<li class=\"d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-suggestion\" role=\"option\">\n  <a tabindex=\"-1\" class=\"no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2\" href=\"\">\n    <div class=\"jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none\">\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none\" title=\"Repository\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none\" title=\"Project\" aria-label=\"Project\" viewBox=\"0 0 15 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none\" title=\"Search\" aria-label=\"Search\" viewBox=\"0 0 16 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\"/></svg>\n    </div>\n\n    <img class=\"avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none\" alt=\"\" aria-label=\"Team\" src=\"\" width=\"28\" height=\"28\">\n\n    <div class=\"jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target\">\n    </div>\n\n    <div class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search\">\n      <span class=\"js-jump-to-badge-search-text-default d-none\" aria-label=\"in this repository\">\n        In this repository\n      </span>\n      <span class=\"js-jump-to-badge-search-text-global d-none\" aria-label=\"in all of GitHub\">\n        All GitHub\n      </span>\n      <span aria-hidden=\"true\" class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n\n    <div aria-hidden=\"true\" class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump\">\n      Jump to\n      <span class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n  </a>\n</li>\n\n</ul>\n\n<ul class=\"d-none js-jump-to-no-results-template-container\">\n  <li class=\"d-flex flex-justify-center flex-items-center f5 d-none js-jump-to-suggestion p-2\">\n    <span class=\"text-gray\">No suggested jump to results</span>\n  </li>\n</ul>\n\n<ul id=\"jump-to-results\" role=\"listbox\" class=\"p-0 m-0 js-navigation-container jump-to-suggestions-results-container js-jump-to-suggestions-results-container\">\n  \n\n<li class=\"d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-scoped-search d-none\" role=\"option\">\n  <a tabindex=\"-1\" class=\"no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2\" href=\"\">\n    <div class=\"jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none\">\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none\" title=\"Repository\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none\" title=\"Project\" aria-label=\"Project\" viewBox=\"0 0 15 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none\" title=\"Search\" aria-label=\"Search\" viewBox=\"0 0 16 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\"/></svg>\n    </div>\n\n    <img class=\"avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none\" alt=\"\" aria-label=\"Team\" src=\"\" width=\"28\" height=\"28\">\n\n    <div class=\"jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target\">\n    </div>\n\n    <div class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search\">\n      <span class=\"js-jump-to-badge-search-text-default d-none\" aria-label=\"in this repository\">\n        In this repository\n      </span>\n      <span class=\"js-jump-to-badge-search-text-global d-none\" aria-label=\"in all of GitHub\">\n        All GitHub\n      </span>\n      <span aria-hidden=\"true\" class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n\n    <div aria-hidden=\"true\" class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump\">\n      Jump to\n      <span class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n  </a>\n</li>\n\n  \n\n<li class=\"d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-global-search d-none\" role=\"option\">\n  <a tabindex=\"-1\" class=\"no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2\" href=\"\">\n    <div class=\"jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none\">\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none\" title=\"Repository\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none\" title=\"Project\" aria-label=\"Project\" viewBox=\"0 0 15 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg>\n      <svg height=\"16\" width=\"16\" class=\"octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none\" title=\"Search\" aria-label=\"Search\" viewBox=\"0 0 16 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\"/></svg>\n    </div>\n\n    <img class=\"avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none\" alt=\"\" aria-label=\"Team\" src=\"\" width=\"28\" height=\"28\">\n\n    <div class=\"jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target\">\n    </div>\n\n    <div class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search\">\n      <span class=\"js-jump-to-badge-search-text-default d-none\" aria-label=\"in this repository\">\n        In this repository\n      </span>\n      <span class=\"js-jump-to-badge-search-text-global d-none\" aria-label=\"in all of GitHub\">\n        All GitHub\n      </span>\n      <span aria-hidden=\"true\" class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n\n    <div aria-hidden=\"true\" class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump\">\n      Jump to\n      <span class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n    </div>\n  </a>\n</li>\n\n\n</ul>\n\n            </div>\n      </label>\n</form>  </div>\n</div>\n\n          </div>\n\n        <a href=\"/login?return_to=%2Fkr%2Flogfmt%2Fblob%2Fmaster%2FReadme\"\n          class=\"HeaderMenu-link no-underline mr-3\"\n          data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;8F0B:627C:263BF7:496F61:5E20F45D&quot;,&quot;originating_url&quot;:&quot;https://github.com/kr/logfmt/blob/master/Readme&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"d42f277a6de866056e94d7c7be7cf99a0ce9483029d7ba2bd51c8045986b15ba\"\n          data-ga-click=\"(Logged out) Header, clicked Sign in, text:sign-in\">\n          Sign&nbsp;in\n        </a>\n          <a href=\"/join?source=header-repo&amp;source_repo=kr%2Flogfmt\"\n            class=\"HeaderMenu-link d-inline-block no-underline border border-gray-dark rounded-1 px-2 py-1\"\n            data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;8F0B:627C:263BF7:496F61:5E20F45D&quot;,&quot;originating_url&quot;:&quot;https://github.com/kr/logfmt/blob/master/Readme&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"d42f277a6de866056e94d7c7be7cf99a0ce9483029d7ba2bd51c8045986b15ba\"\n            data-ga-click=\"(Logged out) Header, clicked Sign up, text:sign-up\">\n            Sign&nbsp;up\n          </a>\n      </div>\n    </div>\n  </div>\n</header>\n\n  </div>\n\n  <div id=\"start-of-content\" class=\"show-on-focus\"></div>\n\n\n    <div id=\"js-flash-container\">\n\n</div>\n\n\n\n  <div class=\"application-main \" data-commit-hovercards-enabled>\n        <div itemscope itemtype=\"http://schema.org/SoftwareSourceCode\" class=\"\">\n    <main  >\n      \n\n\n  \n\n\n\n\n\n\n\n\n\n\n  <div class=\" pagehead repohead readability-menu experiment-repo-nav pt-0 pt-lg-4 \">\n\n    <div class=\"container-lg mb-4 p-responsive d-none d-lg-flex\">\n\n      <div class=\"flex-auto min-width-0 width-fit mr-3\">\n        <h1 class=\"public  d-flex flex-wrap flex-items-center break-word float-none\">\n    <svg class=\"octicon octicon-repo mr-1\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"/></svg>\n  <span class=\"author\" itemprop=\"author\">\n    <a class=\"url fn\" rel=\"author\" data-hovercard-type=\"user\" data-hovercard-url=\"/users/kr/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"/kr\">kr</a>\n  </span>\n  <span class=\"path-divider\">/</span>\n  <strong itemprop=\"name\" class=\"mr-2\">\n    <a data-pjax=\"#js-repo-pjax-container\" href=\"/kr/logfmt\">logfmt</a>\n  </strong>\n  \n</h1>\n\n\n      </div>\n\n      <ul class=\"pagehead-actions flex-shrink-0\">\n\n\n\n\n  <li>\n    \n  <a class=\"tooltipped tooltipped-s btn btn-sm btn-with-count\" aria-label=\"You must be signed in to watch a repository\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;8F0B:627C:263BF7:496F61:5E20F45D&quot;,&quot;originating_url&quot;:&quot;https://github.com/kr/logfmt/blob/master/Readme&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"bf48cdfae42f128a81dadbf8a0a71db5851a7b52adf2a2080cbb889186f4aede\" href=\"/login?return_to=%2Fkr%2Flogfmt\">\n    <svg class=\"octicon octicon-eye v-align-text-bottom\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z\"/></svg>\n    Watch\n</a>    <a class=\"social-count\" href=\"/kr/logfmt/watchers\"\n       aria-label=\"3 users are watching this repository\">\n      3\n    </a>\n\n  </li>\n\n  <li>\n        <a class=\"btn btn-sm btn-with-count tooltipped tooltipped-s\" aria-label=\"You must be signed in to star a repository\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:6713416,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;8F0B:627C:263BF7:496F61:5E20F45D&quot;,&quot;originating_url&quot;:&quot;https://github.com/kr/logfmt/blob/master/Readme&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"c460a75ee11e1bf77ea0897132d3e135a1ab5483be2b0f49c482c7ca563dcd8e\" href=\"/login?return_to=%2Fkr%2Flogfmt\">\n      <svg aria-label=\"star\" height=\"16\" class=\"octicon octicon-star v-align-text-bottom\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z\"/></svg>\n\n      Star\n</a>\n    <a class=\"social-count js-social-count\" href=\"/kr/logfmt/stargazers\"\n      aria-label=\"102 users starred this repository\">\n      102\n    </a>\n\n  </li>\n\n  <li>\n      <a class=\"btn btn-sm btn-with-count tooltipped tooltipped-s\" aria-label=\"You must be signed in to fork a repository\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:6713416,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;8F0B:627C:263BF7:496F61:5E20F45D&quot;,&quot;originating_url&quot;:&quot;https://github.com/kr/logfmt/blob/master/Readme&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"5761e5b6f39911bdb0b49b9e3f7dd0622ee96007f3133d637965d21f9473c91c\" href=\"/login?return_to=%2Fkr%2Flogfmt\">\n        <svg class=\"octicon octicon-repo-forked v-align-text-bottom\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 1a1.993 1.993 0 00-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 002 1a1.993 1.993 0 00-1 3.72V6.5l3 3v1.78A1.993 1.993 0 005 15a1.993 1.993 0 001-3.72V9.5l3-3V4.72A1.993 1.993 0 008 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"/></svg>\n        Fork\n</a>\n    <a href=\"/kr/logfmt/network/members\" class=\"social-count\"\n       aria-label=\"10 users forked this repository\">\n      10\n    </a>\n  </li>\n</ul>\n\n    </div>\n    \n<nav class=\"hx_reponav reponav js-repo-nav js-sidenav-container-pjax clearfix container-lg p-responsive d-none d-lg-block\"\n     itemscope\n     itemtype=\"http://schema.org/BreadcrumbList\"\n    aria-label=\"Repository\"\n     data-pjax=\"#js-repo-pjax-container\">\n\n  <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n    <a class=\"js-selected-navigation-item selected reponav-item\" itemprop=\"url\" data-hotkey=\"g c\" aria-current=\"page\" data-selected-links=\"repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /kr/logfmt\" href=\"/kr/logfmt\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-code\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9.5 3L8 4.5 11.5 8 8 11.5 9.5 13 14 8 9.5 3zm-5 0L0 8l4.5 5L6 11.5 2.5 8 6 4.5 4.5 3z\"/></svg></div>\n      <span itemprop=\"name\">Code</span>\n      <meta itemprop=\"position\" content=\"1\">\n</a>  </span>\n\n    <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n      <a itemprop=\"url\" data-hotkey=\"g i\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_issues repo_labels repo_milestones /kr/logfmt/issues\" href=\"/kr/logfmt/issues\">\n        <div class=\"d-inline\"><svg class=\"octicon octicon-issue-opened\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 011.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"/></svg></div>\n        <span itemprop=\"name\">Issues</span>\n        <span class=\"Counter\">2</span>\n        <meta itemprop=\"position\" content=\"2\">\n</a>    </span>\n\n\n  <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n    <a data-hotkey=\"g p\" data-skip-pjax=\"true\" itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_pulls checks /kr/logfmt/pulls\" href=\"/kr/logfmt/pulls\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-git-pull-request\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0010 15a1.993 1.993 0 001-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 00-1 3.72v6.56A1.993 1.993 0 002 15a1.993 1.993 0 001-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"/></svg></div>\n      <span itemprop=\"name\">Pull requests</span>\n      <span class=\"Counter\">1</span>\n      <meta itemprop=\"position\" content=\"4\">\n</a>  </span>\n\n\n    <a data-hotkey=\"g b\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_projects new_repo_project repo_project /kr/logfmt/projects\" href=\"/kr/logfmt/projects\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-project\" viewBox=\"0 0 15 16\" version=\"1.1\" width=\"15\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z\"/></svg></div>\n      Projects\n      <span class=\"Counter\" >0</span>\n</a>\n\n\n    <a data-skip-pjax=\"true\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"security alerts policy token_scanning lgtm /kr/logfmt/security/advisories\" href=\"/kr/logfmt/security/advisories\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-shield\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M0 2l7-2 7 2v6.02C14 12.69 8.69 16 7 16c-1.69 0-7-3.31-7-7.98V2zm1 .75L7 1l6 1.75v5.268C13 12.104 8.449 15 7 15c-1.449 0-6-2.896-6-6.982V2.75zm1 .75L7 2v12c-1.207 0-5-2.482-5-5.985V3.5z\"/></svg></div>\n      Security\n</a>\n    <a class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_graphs repo_contributors dependency_graph pulse people /kr/logfmt/pulse\" href=\"/kr/logfmt/pulse\">\n      <div class=\"d-inline\"><svg class=\"octicon octicon-graph\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M16 14v1H0V0h1v14h15zM5 13H3V8h2v5zm4 0H7V3h2v10zm4 0h-2V6h2v7z\"/></svg></div>\n      Insights\n</a>\n\n</nav>\n\n  <div class=\"reponav-wrapper reponav-small d-lg-none\">\n  <nav class=\"reponav js-reponav text-center no-wrap\"\n       itemscope\n       itemtype=\"http://schema.org/BreadcrumbList\">\n\n    <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n      <a class=\"js-selected-navigation-item selected reponav-item\" itemprop=\"url\" aria-current=\"page\" data-selected-links=\"repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /kr/logfmt\" href=\"/kr/logfmt\">\n        <span itemprop=\"name\">Code</span>\n        <meta itemprop=\"position\" content=\"1\">\n</a>    </span>\n\n      <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n        <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_issues repo_labels repo_milestones /kr/logfmt/issues\" href=\"/kr/logfmt/issues\">\n          <span itemprop=\"name\">Issues</span>\n          <span class=\"Counter\">2</span>\n          <meta itemprop=\"position\" content=\"2\">\n</a>      </span>\n\n\n    <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n      <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_pulls checks /kr/logfmt/pulls\" href=\"/kr/logfmt/pulls\">\n        <span itemprop=\"name\">Pull requests</span>\n        <span class=\"Counter\">1</span>\n        <meta itemprop=\"position\" content=\"4\">\n</a>    </span>\n\n      <span itemscope itemtype=\"http://schema.org/ListItem\" itemprop=\"itemListElement\">\n        <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"repo_projects new_repo_project repo_project /kr/logfmt/projects\" href=\"/kr/logfmt/projects\">\n          <span itemprop=\"name\">Projects</span>\n          <span class=\"Counter\">0</span>\n          <meta itemprop=\"position\" content=\"5\">\n</a>      </span>\n\n\n      <a itemprop=\"url\" class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"security alerts policy token_scanning lgtm /kr/logfmt/security/advisories\" href=\"/kr/logfmt/security/advisories\">\n        <span itemprop=\"name\">Security</span>\n        <meta itemprop=\"position\" content=\"7\">\n</a>\n      <a class=\"js-selected-navigation-item reponav-item\" data-selected-links=\"pulse /kr/logfmt/pulse\" href=\"/kr/logfmt/pulse\">\n        Pulse\n</a>\n\n  </nav>\n</div>\n\n\n  </div>\n<div class=\"container-lg clearfix new-discussion-timeline experiment-repo-nav  p-responsive\">\n  <div class=\"repository-content \">\n\n    \n    \n\n\n  \n\n\n    <a class=\"d-none js-permalink-shortcut\" data-hotkey=\"y\" href=\"/kr/logfmt/blob/b84e30acd515aadc4b783ad4ff83aff3299bdfe0/Readme\">Permalink</a>\n\n    <!-- blob contrib key: blob_contributors:v21:86a08583cdeb3a3d677092f284e14be2 -->\n          <div class=\"signup-prompt-bg rounded-1\">\n      <div class=\"signup-prompt p-4 text-center mb-4 rounded-1\">\n        <div class=\"position-relative\">\n          <!-- '\"` --><!-- </textarea></xmp> --></option></form><form action=\"/prompt_dismissals/signup\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /><input type=\"hidden\" name=\"_method\" value=\"put\" /><input type=\"hidden\" name=\"authenticity_token\" value=\"il3FcGlVqj5v59z3XSp0VKIB60BHhYYHFu4B/XTJWhevobyblzoM5Gj0Qeld7pJLBTCQQEHiMF6rINSMfzziJA==\" />\n            <button type=\"submit\" class=\"position-absolute top-0 right-0 btn-link link-gray\" data-ga-click=\"(Logged out) Sign up prompt, clicked Dismiss, text:dismiss\">\n              Dismiss\n            </button>\n</form>          <h3 class=\"pt-2\">Join GitHub today</h3>\n          <p class=\"col-6 mx-auto\">GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.</p>\n          <a class=\"btn btn-primary\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;files signup prompt&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;client_id&quot;:null,&quot;originating_request_id&quot;:&quot;8F0B:627C:263BF7:496F61:5E20F45D&quot;,&quot;originating_url&quot;:&quot;https://github.com/kr/logfmt/blob/master/Readme&quot;,&quot;referrer&quot;:null,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"6d517688f28408a529041948152b00fbcd4e92c3bb3be6fa642a5fce494ca16f\" data-ga-click=\"(Logged out) Sign up prompt, clicked Sign up, text:sign-up\" href=\"/join?source=prompt-blob-show&amp;source_repo=kr%2Flogfmt\">Sign up</a>\n        </div>\n      </div>\n    </div>\n\n\n    <div class=\"d-flex flex-items-start flex-shrink-0 pb-3 flex-column flex-md-row\">\n      <span class=\"d-flex flex-justify-between width-full width-md-auto\">\n        \n<details class=\"details-reset details-overlay select-menu branch-select-menu  hx_rsm\" id=\"branch-select-menu\">\n  <summary class=\"btn btn-sm select-menu-button css-truncate\"\n           data-hotkey=\"w\"\n           title=\"Switch branches or tags\">\n    <i>Branch:</i>\n    <span class=\"css-truncate-target\" data-menu-button>master</span>\n  </summary>\n\n  <details-menu class=\"select-menu-modal hx_rsm-modal position-absolute\" style=\"z-index: 99;\" src=\"/kr/logfmt/refs/master/Readme?source_action=show&amp;source_controller=blob\" preload>\n    <include-fragment class=\"select-menu-loading-overlay anim-pulse\">\n      <svg height=\"32\" class=\"octicon octicon-octoface\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"32\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M14.7 5.34c.13-.32.55-1.59-.13-3.31 0 0-1.05-.33-3.44 1.3-1-.28-2.07-.32-3.13-.32s-2.13.04-3.13.32c-2.39-1.64-3.44-1.3-3.44-1.3-.68 1.72-.26 2.99-.13 3.31C.49 6.21 0 7.33 0 8.69 0 13.84 3.33 15 7.98 15S16 13.84 16 8.69c0-1.36-.49-2.48-1.3-3.35zM8 14.02c-3.3 0-5.98-.15-5.98-3.35 0-.76.38-1.48 1.02-2.07 1.07-.98 2.9-.46 4.96-.46 2.07 0 3.88-.52 4.96.46.65.59 1.02 1.3 1.02 2.07 0 3.19-2.68 3.35-5.98 3.35zM5.49 9.01c-.66 0-1.2.8-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.54-1.78-1.2-1.78zm5.02 0c-.66 0-1.2.79-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.53-1.78-1.2-1.78z\"/></svg>\n    </include-fragment>\n  </details-menu>\n</details>\n\n        <div class=\"BtnGroup flex-shrink-0 d-md-none\">\n          <a href=\"/kr/logfmt/find/master\"\n                class=\"js-pjax-capture-input btn btn-sm BtnGroup-item\"\n                data-pjax\n                data-hotkey=\"t\">\n            Find file\n          </a>\n          <clipboard-copy value=\"Readme\" class=\"btn btn-sm BtnGroup-item\">\n            Copy path\n          </clipboard-copy>\n        </div>\n      </span>\n      <h2 id=\"blob-path\" class=\"breadcrumb flex-auto min-width-0 text-normal flex-md-self-center ml-md-2 mr-md-3 my-2 my-md-0\">\n        <span class=\"js-repo-root text-bold\"><span class=\"js-path-segment\"><a data-pjax=\"true\" href=\"/kr/logfmt\"><span>logfmt</span></a></span></span><span class=\"separator\">/</span><strong class=\"final-path\">Readme</strong>\n      </h2>\n\n      <div class=\"BtnGroup flex-shrink-0 d-none d-md-inline-block\">\n        <a href=\"/kr/logfmt/find/master\"\n              class=\"js-pjax-capture-input btn btn-sm BtnGroup-item\"\n              data-pjax\n              data-hotkey=\"t\">\n          Find file\n        </a>\n        <clipboard-copy value=\"Readme\" class=\"btn btn-sm BtnGroup-item\">\n          Copy path\n        </clipboard-copy>\n      </div>\n    </div>\n\n    \n\n\n\n    <include-fragment src=\"/kr/logfmt/contributors/master/Readme\" class=\"Box Box--condensed commit-loader\">\n      <div class=\"Box-body bg-blue-light f6\">\n        Fetching contributors&hellip;\n      </div>\n\n      <div class=\"Box-body d-flex flex-items-center\" >\n          <img alt=\"\" class=\"loader-loading mr-2\" src=\"https://github.githubassets.com/images/spinners/octocat-spinner-32-EAF2F5.gif\" width=\"16\" height=\"16\" />\n        <span class=\"text-red h6 loader-error\">Cannot retrieve contributors at this time</span>\n      </div>\n</include-fragment>\n\n\n\n\n    <div class=\"Box mt-3 position-relative\">\n      \n<div class=\"Box-header py-2 d-flex flex-column flex-shrink-0 flex-md-row flex-md-items-center\">\n  <div class=\"text-mono f6 flex-auto pr-3 flex-order-2 flex-md-order-1 mt-2 mt-md-0\">\n\n      12 lines (7 sloc)\n      <span class=\"file-info-divider\"></span>\n    1.22 KB\n  </div>\n\n  <div class=\"d-flex py-1 py-md-0 flex-auto flex-order-1 flex-md-order-2 flex-sm-grow-0 flex-justify-between\">\n\n    <div class=\"BtnGroup\">\n      <a id=\"raw-url\" class=\"btn btn-sm BtnGroup-item\" href=\"/kr/logfmt/raw/master/Readme\">Raw</a>\n        <a class=\"btn btn-sm js-update-url-with-hash BtnGroup-item\" data-hotkey=\"b\" href=\"/kr/logfmt/blame/master/Readme\">Blame</a>\n      <a rel=\"nofollow\" class=\"btn btn-sm BtnGroup-item\" href=\"/kr/logfmt/commits/master/Readme\">History</a>\n    </div>\n\n\n    <div>\n\n          <button type=\"button\" class=\"btn-octicon disabled tooltipped tooltipped-nw\"\n            aria-label=\"You must be signed in to make or propose changes\">\n            <svg class=\"octicon octicon-pencil\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M0 12v3h3l8-8-3-3-8 8zm3 2H1v-2h1v1h1v1zm10.3-9.3L12 6 9 3l1.3-1.3a.996.996 0 011.41 0l1.59 1.59c.39.39.39 1.02 0 1.41z\"/></svg>\n          </button>\n          <button type=\"button\" class=\"btn-octicon btn-octicon-danger disabled tooltipped tooltipped-nw\"\n            aria-label=\"You must be signed in to make or propose changes\">\n            <svg class=\"octicon octicon-trashcan\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 2H9c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1H2c-.55 0-1 .45-1 1v1c0 .55.45 1 1 1v9c0 .55.45 1 1 1h7c.55 0 1-.45 1-1V5c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm-1 12H3V5h1v8h1V5h1v8h1V5h1v8h1V5h1v9zm1-10H2V3h9v1z\"/></svg>\n          </button>\n    </div>\n  </div>\n</div>\n\n\n\n\n      \n\n  <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-text \">\n      \n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\">\n      <tr>\n        <td id=\"L1\" class=\"blob-num js-line-number\" data-line-number=\"1\"></td>\n        <td id=\"LC1\" class=\"blob-code blob-code-inner js-file-line\">Go package for parsing (and, eventually, generating)</td>\n      </tr>\n      <tr>\n        <td id=\"L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"></td>\n        <td id=\"LC2\" class=\"blob-code blob-code-inner js-file-line\">log lines in the logfmt style.</td>\n      </tr>\n      <tr>\n        <td id=\"L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"></td>\n        <td id=\"LC3\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"></td>\n        <td id=\"LC4\" class=\"blob-code blob-code-inner js-file-line\">See http://godoc.org/github.com/kr/logfmt for format, and other documentation and examples.</td>\n      </tr>\n      <tr>\n        <td id=\"L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"></td>\n        <td id=\"LC5\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"></td>\n        <td id=\"LC6\" class=\"blob-code blob-code-inner js-file-line\">Copyright (C) 2013 Keith Rarick, Blake Mizerany</td>\n      </tr>\n      <tr>\n        <td id=\"L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"></td>\n        <td id=\"LC7\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"></td>\n        <td id=\"LC8\" class=\"blob-code blob-code-inner js-file-line\">Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</td>\n      </tr>\n      <tr>\n        <td id=\"L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"></td>\n        <td id=\"LC9\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"></td>\n        <td id=\"LC10\" class=\"blob-code blob-code-inner js-file-line\">The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</td>\n      </tr>\n      <tr>\n        <td id=\"L11\" class=\"blob-num js-line-number\" data-line-number=\"11\"></td>\n        <td id=\"LC11\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"L12\" class=\"blob-num js-line-number\" data-line-number=\"12\"></td>\n        <td id=\"LC12\" class=\"blob-code blob-code-inner js-file-line\">THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</td>\n      </tr>\n</table>\n\n  <details class=\"details-reset details-overlay BlobToolbar position-absolute js-file-line-actions dropdown d-none\" aria-hidden=\"true\">\n    <summary class=\"btn-octicon ml-0 px-2 p-0 bg-white border border-gray-dark rounded-1\" aria-label=\"Inline file action toolbar\">\n      <svg class=\"octicon octicon-kebab-horizontal\" viewBox=\"0 0 13 16\" version=\"1.1\" width=\"13\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm5 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM13 7.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z\"/></svg>\n    </summary>\n    <details-menu>\n      <ul class=\"BlobToolbar-dropdown dropdown-menu dropdown-menu-se mt-2\" style=\"width:185px\">\n        <li>\n          <clipboard-copy role=\"menuitem\" class=\"dropdown-item\" id=\"js-copy-lines\" style=\"cursor:pointer;\">\n            Copy lines\n          </clipboard-copy>\n        </li>\n        <li>\n          <clipboard-copy role=\"menuitem\" class=\"dropdown-item\" id=\"js-copy-permalink\" style=\"cursor:pointer;\">\n            Copy permalink\n          </clipboard-copy>\n        </li>\n        <li><a class=\"dropdown-item js-update-url-with-hash\" id=\"js-view-git-blame\" role=\"menuitem\" href=\"/kr/logfmt/blame/b84e30acd515aadc4b783ad4ff83aff3299bdfe0/Readme\">View git blame</a></li>\n          <li><a class=\"dropdown-item\" id=\"js-new-issue\" role=\"menuitem\" href=\"/kr/logfmt/issues/new\">Reference in new issue</a></li>\n      </ul>\n    </details-menu>\n  </details>\n\n  </div>\n\n    </div>\n\n  \n\n  <details class=\"details-reset details-overlay details-overlay-dark\">\n    <summary data-hotkey=\"l\" aria-label=\"Jump to line\"></summary>\n    <details-dialog class=\"Box Box--overlay d-flex flex-column anim-fade-in fast linejump\" aria-label=\"Jump to line\">\n      <!-- '\"` --><!-- </textarea></xmp> --></option></form><form class=\"js-jump-to-line-form Box-body d-flex\" action=\"\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" />\n        <input class=\"form-control flex-auto mr-3 linejump-input js-jump-to-line-field\" type=\"text\" placeholder=\"Jump to line&hellip;\" aria-label=\"Jump to line\" autofocus>\n        <button type=\"submit\" class=\"btn\" data-close-dialog>Go</button>\n</form>    </details-dialog>\n  </details>\n\n\n\n  </div>\n</div>\n\n    </main>\n  </div>\n  \n\n  </div>\n\n        \n<div class=\"footer container-lg width-full p-responsive\" role=\"contentinfo\">\n  <div class=\"position-relative d-flex flex-row-reverse flex-lg-row flex-wrap flex-lg-nowrap flex-justify-center flex-lg-justify-between pt-6 pb-2 mt-6 f6 text-gray border-top border-gray-light \">\n    <ul class=\"list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0\">\n      <li class=\"mr-3 mr-lg-0\">&copy; 2020 GitHub, Inc.</li>\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to terms, text:terms\" href=\"https://github.com/site/terms\">Terms</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to privacy, text:privacy\" href=\"https://github.com/site/privacy\">Privacy</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to security, text:security\" href=\"https://github.com/security\">Security</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a href=\"https://githubstatus.com/\" data-ga-click=\"Footer, go to status, text:status\">Status</a></li>\n        <li><a data-ga-click=\"Footer, go to help, text:help\" href=\"https://help.github.com\">Help</a></li>\n    </ul>\n\n    <a aria-label=\"Homepage\" title=\"GitHub\" class=\"footer-octicon d-none d-lg-block mx-lg-4\" href=\"https://github.com\">\n      <svg height=\"24\" class=\"octicon octicon-mark-github\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"24\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"/></svg>\n</a>\n   <ul class=\"list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0\">\n        <li class=\"mr-3 mr-lg-0\"><a data-ga-click=\"Footer, go to contact, text:contact\" href=\"https://github.com/contact\">Contact GitHub</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a href=\"https://github.com/pricing\" data-ga-click=\"Footer, go to Pricing, text:Pricing\">Pricing</a></li>\n      <li class=\"mr-3 mr-lg-0\"><a href=\"https://developer.github.com\" data-ga-click=\"Footer, go to api, text:api\">API</a></li>\n      <li class=\"mr-3 mr-lg-0\"><a href=\"https://training.github.com\" data-ga-click=\"Footer, go to training, text:training\">Training</a></li>\n        <li class=\"mr-3 mr-lg-0\"><a href=\"https://github.blog\" data-ga-click=\"Footer, go to blog, text:blog\">Blog</a></li>\n        <li><a data-ga-click=\"Footer, go to about, text:about\" href=\"https://github.com/about\">About</a></li>\n\n    </ul>\n  </div>\n  <div class=\"d-flex flex-justify-center pb-6\">\n    <span class=\"f6 text-gray-light\"></span>\n  </div>\n</div>\n\n\n\n  <div id=\"ajax-error-message\" class=\"ajax-error-message flash flash-error\">\n    <svg class=\"octicon octicon-alert\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 000 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 00.01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"/></svg>\n    <button type=\"button\" class=\"flash-close js-ajax-error-dismiss\" aria-label=\"Dismiss error\">\n      <svg class=\"octicon octicon-x\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"/></svg>\n    </button>\n    You can’t perform that action at this time.\n  </div>\n\n\n    <script crossorigin=\"anonymous\" integrity=\"sha512-mdrBasYG+QjgS391PSyVkPr06io3gWplCVbPscguetNEHxIEt+mZwCeCxPR9eMNfda6qNuibNFqBo5ak2+O/hg==\" type=\"application/javascript\" src=\"https://github.githubassets.com/assets/compat-bootstrap-99dac16a.js\"></script>\n    <script crossorigin=\"anonymous\" integrity=\"sha512-/VSJJF96vCzSgC6y09Z4FqzjjuXRWOKIq2twF0Nb5/v8xy4qzngnH6Au6TFwbmNN/lborYJsojEpgIbYjoGvHQ==\" type=\"application/javascript\" src=\"https://github.githubassets.com/assets/frameworks-fd548924.js\"></script>\n    \n    <script crossorigin=\"anonymous\" async=\"async\" integrity=\"sha512-m5yUV1k2rIlsiXzuekXmQRaGOGWxP1UsTTiDsWuhrYGi3pDU0B0chnrznxqNjPrc1I6egRU9k9i8XT581R7nPw==\" type=\"application/javascript\" src=\"https://github.githubassets.com/assets/github-bootstrap-9b9c9457.js\"></script>\n    \n    \n    \n  <div class=\"js-stale-session-flash flash flash-warn flash-banner\" hidden\n    >\n    <svg class=\"octicon octicon-alert\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 000 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 00.01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"/></svg>\n    <span class=\"js-stale-session-flash-signed-in\" hidden>You signed in with another tab or window. <a href=\"\">Reload</a> to refresh your session.</span>\n    <span class=\"js-stale-session-flash-signed-out\" hidden>You signed out in another tab or window. <a href=\"\">Reload</a> to refresh your session.</span>\n  </div>\n  <template id=\"site-details-dialog\">\n  <details class=\"details-reset details-overlay details-overlay-dark lh-default text-gray-dark hx_rsm\" open>\n    <summary role=\"button\" aria-label=\"Close dialog\"></summary>\n    <details-dialog class=\"Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal\">\n      <button class=\"Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0\" type=\"button\" aria-label=\"Close dialog\" data-close-dialog>\n        <svg class=\"octicon octicon-x\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"/></svg>\n      </button>\n      <div class=\"octocat-spinner my-6 js-details-dialog-spinner\"></div>\n    </details-dialog>\n  </details>\n</template>\n\n  <div class=\"Popover js-hovercard-content position-absolute\" style=\"display: none; outline: none;\" tabindex=\"0\">\n  <div class=\"Popover-message Popover-message--bottom-left Popover-message--large Box box-shadow-large\" style=\"width:360px;\">\n  </div>\n</div>\n\n  <div aria-live=\"polite\" class=\"js-global-screen-reader-notice sr-only\"></div>\n\n  </body>\n</html>\n\n\n"
  },
  {
    "path": "third_party/license_info.csv",
    "content": "kubeflow/kfctl,https://github.com/kubeflow/kfctl/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubeflow/kfctl/master/LICENSE\nGoogleCloudPlatform/gcloud-golang,https://github.com/googleapis/google-cloud-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/googleapis/google-cloud-go/master/LICENSE\nAzure/azure-sdk-for-go,https://github.com/Azure/azure-sdk-for-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/Azure/azure-sdk-for-go/master/LICENSE\nAzure/go-ansiterm,https://github.com/Azure/go-ansiterm/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/Azure/go-ansiterm/master/LICENSE\nAzure/go-autorest,https://github.com/Azure/go-autorest/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/Azure/go-autorest/master/LICENSE\nBurntSushi/toml,https://github.com/BurntSushi/toml/blob/master/COPYING,MIT License,https://raw.githubusercontent.com/BurntSushi/toml/master/COPYING\nBurntSushi/xgb,https://github.com/BurntSushi/xgb/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/BurntSushi/xgb/master/LICENSE\nGoogleCloudPlatform/k8s-cloud-provider,https://github.com/GoogleCloudPlatform/k8s-cloud-provider/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-cloud-provider/master/LICENSE\nJeffAshton/win_pdh,https://github.com/JeffAshton/win_pdh/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/JeffAshton/win_pdh/master/LICENSE\nMakeNowJust/heredoc,https://github.com/MakeNowJust/heredoc/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/MakeNowJust/heredoc/master/LICENSE\nMicrosoft/go-winio,https://github.com/microsoft/go-winio/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/microsoft/go-winio/master/LICENSE\nMicrosoft/hcsshim,https://github.com/microsoft/hcsshim/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/microsoft/hcsshim/master/LICENSE\nNYTimes/gziphandler,https://github.com/nytimes/gziphandler/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/nytimes/gziphandler/master/LICENSE\nPuerkitoBio/purell,https://github.com/PuerkitoBio/purell/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/PuerkitoBio/purell/master/LICENSE\nPuerkitoBio/urlesc,https://github.com/PuerkitoBio/urlesc/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/PuerkitoBio/urlesc/master/LICENSE\nRican7/retry,https://github.com/Rican7/retry/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/Rican7/retry/master/LICENSE\nSirupsen/logrus,https://github.com/sirupsen/logrus/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/sirupsen/logrus/master/LICENSE\nalecthomas/template,https://github.com/alecthomas/template/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/alecthomas/template/master/LICENSE\nalecthomas/units,https://github.com/alecthomas/units/blob/master/COPYING,MIT License,https://raw.githubusercontent.com/alecthomas/units/master/COPYING\nappscode/jsonpatch,https://github.com/gomodules/jsonpatch/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/gomodules/jsonpatch/master/LICENSE\narmon/circbuf,https://github.com/armon/circbuf/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/armon/circbuf/master/LICENSE\narmon/consul-api,https://github.com/armon/consul-api/blob/master/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/armon/consul-api/master/LICENSE\nasaskevich/govalidator,https://github.com/asaskevich/govalidator/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/asaskevich/govalidator/master/LICENSE\nauth0/go-jwt-middleware,https://github.com/auth0/go-jwt-middleware/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/auth0/go-jwt-middleware/master/LICENSE\naws/aws-sdk-go,https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt,Apache License 2.0,https://raw.githubusercontent.com/aws/aws-sdk-go/master/LICENSE.txt\nbazelbuild/bazel-gazelle,https://github.com/bazelbuild/bazel-gazelle/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/bazelbuild/bazel-gazelle/master/LICENSE\nbazelbuild/buildtools,https://github.com/bazelbuild/buildtools/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/bazelbuild/buildtools/master/LICENSE\nbeorn7/perks,https://github.com/beorn7/perks/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/beorn7/perks/master/LICENSE\nbgentry/go-netrc,https://github.com/bgentry/go-netrc/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/bgentry/go-netrc/master/LICENSE\nblang/semver,https://github.com/blang/semver/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/blang/semver/master/LICENSE\nboltdb/bolt,https://github.com/boltdb/bolt/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/boltdb/bolt/master/LICENSE\ncenkalti/backoff,https://github.com/cenkalti/backoff/blob/v4/LICENSE,MIT License,https://raw.githubusercontent.com/cenkalti/backoff/v4/LICENSE\ncespare/prettybench,https://github.com/cespare/prettybench/blob/master/LICENSE.txt,MIT License,https://raw.githubusercontent.com/cespare/prettybench/master/LICENSE.txt\nchai2010/gettext-go,https://github.com/chai2010/gettext-go/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/chai2010/gettext-go/master/LICENSE\ncheggaaa/pb,https://github.com/cheggaaa/pb/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/cheggaaa/pb/master/LICENSE\nclient9/misspell,https://github.com/client9/misspell/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/client9/misspell/master/LICENSE\ncloudflare/cfssl,https://github.com/cloudflare/cfssl/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/cloudflare/cfssl/master/LICENSE\nclusterhq/flocker-go,https://github.com/ClusterHQ/flocker-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/ClusterHQ/flocker-go/master/LICENSE\ncodedellemc/goscaleio,https://github.com/thecodeteam/goscaleio/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/thecodeteam/goscaleio/master/LICENSE\ncodegangsta/negroni,https://github.com/urfave/negroni/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/urfave/negroni/master/LICENSE\ncontainer-storage-interface/spec,https://github.com/container-storage-interface/spec/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/container-storage-interface/spec/master/LICENSE\ncontainerd/console,https://github.com/containerd/console/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/containerd/console/master/LICENSE\ncontainerd/containerd,https://github.com/containerd/containerd/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/containerd/containerd/master/LICENSE\ncontainerd/typeurl,https://github.com/containerd/typeurl/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/containerd/typeurl/master/LICENSE\ncontainernetworking/cni,https://github.com/containernetworking/cni/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/containernetworking/cni/master/LICENSE\ncoreos/bbolt,https://github.com/etcd-io/bbolt/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/etcd-io/bbolt/master/LICENSE\ncoreos/etcd,https://github.com/etcd-io/etcd/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/etcd-io/etcd/master/LICENSE\ncoreos/go-etcd,https://github.com/coreos/go-etcd/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/coreos/go-etcd/master/LICENSE\ncoreos/go-oidc,https://github.com/coreos/go-oidc/blob/v2/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/coreos/go-oidc/v2/LICENSE\ncoreos/go-semver,https://github.com/coreos/go-semver/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/coreos/go-semver/master/LICENSE\ncoreos/go-systemd,https://github.com/coreos/go-systemd/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/coreos/go-systemd/master/LICENSE\ncoreos/pkg,https://github.com/coreos/pkg/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/coreos/pkg/master/LICENSE\ncoreos/rkt,https://github.com/rkt/rkt/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/rkt/rkt/master/LICENSE\ncpuguy83/go-md2man,https://github.com/cpuguy83/go-md2man/blob/master/LICENSE.md,MIT License,https://raw.githubusercontent.com/cpuguy83/go-md2man/master/LICENSE.md\ncyphar/filepath-securejoin,https://github.com/cyphar/filepath-securejoin/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/cyphar/filepath-securejoin/master/LICENSE\nd2g/dhcp4,https://github.com/d2g/dhcp4/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/d2g/dhcp4/master/LICENSE\nd2g/dhcp4client,https://github.com/d2g/dhcp4client/blob/v1/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/d2g/dhcp4client/v1/LICENSE\ndavecgh/go-spew,https://github.com/davecgh/go-spew/blob/master/LICENSE,ISC License,https://raw.githubusercontent.com/davecgh/go-spew/master/LICENSE\ndaviddengcn/go-colortext,https://github.com/daviddengcn/go-colortext/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/daviddengcn/go-colortext/master/LICENSE\ndeckarep/golang-set,https://github.com/deckarep/golang-set/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/deckarep/golang-set/master/LICENSE\ndgrijalva/jwt-go,https://github.com/dgrijalva/jwt-go/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/dgrijalva/jwt-go/master/LICENSE\ndnaeon/go-vcr,https://github.com/dnaeon/go-vcr/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/dnaeon/go-vcr/master/LICENSE\ndocker/distribution,https://github.com/docker/distribution/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/docker/distribution/master/LICENSE\ndocker/docker,https://github.com/moby/moby/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/moby/moby/master/LICENSE\ndocker/go-connections,https://github.com/docker/go-connections/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/docker/go-connections/master/LICENSE\ndocker/go-units,https://github.com/docker/go-units/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/docker/go-units/master/LICENSE\ndocker/libnetwork,https://github.com/docker/libnetwork/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/docker/libnetwork/master/LICENSE\ndocker/spdystream,https://github.com/docker/spdystream/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/docker/spdystream/master/LICENSE\nelazarl/goproxy,https://github.com/elazarl/goproxy/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/elazarl/goproxy/master/LICENSE\nemicklei/go-restful,https://github.com/emicklei/go-restful/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/emicklei/go-restful/master/LICENSE\neuank/go-kmsg-parser,https://github.com/euank/go-kmsg-parser/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/euank/go-kmsg-parser/master/LICENSE\nexponent-io/jsonpath,https://github.com/exponent-io/jsonpath/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/exponent-io/jsonpath/master/LICENSE\nfatih/camelcase,https://github.com/fatih/camelcase/blob/master/LICENSE.md,MIT License,https://raw.githubusercontent.com/fatih/camelcase/master/LICENSE.md\nfatih/color,https://github.com/fatih/color/blob/master/LICENSE.md,MIT License,https://raw.githubusercontent.com/fatih/color/master/LICENSE.md\nfsnotify/fsnotify,https://github.com/fsnotify/fsnotify/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/fsnotify/fsnotify/master/LICENSE\nghodss/yaml,https://github.com/ghodss/yaml/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/ghodss/yaml/master/LICENSE\nglobalsign/mgo,https://github.com/globalsign/mgo/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/globalsign/mgo/master/LICENSE\ngo-kit/kit,https://github.com/go-kit/kit/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/go-kit/kit/master/LICENSE\ngo-logfmt/logfmt,https://github.com/go-logfmt/logfmt/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/go-logfmt/logfmt/master/LICENSE\ngo-logr/logr,https://github.com/go-logr/logr/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-logr/logr/master/LICENSE\ngo-logr/zapr,https://github.com/go-logr/zapr/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-logr/zapr/master/LICENSE\ngo-openapi/analysis,https://github.com/go-openapi/analysis/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/analysis/master/LICENSE\ngo-openapi/errors,https://github.com/go-openapi/errors/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/errors/master/LICENSE\ngo-openapi/jsonpointer,https://github.com/go-openapi/jsonpointer/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE\ngo-openapi/jsonreference,https://github.com/go-openapi/jsonreference/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE\ngo-openapi/loads,https://github.com/go-openapi/loads/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/loads/master/LICENSE\ngo-openapi/runtime,https://github.com/go-openapi/runtime/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/runtime/master/LICENSE\ngo-openapi/spec,https://github.com/go-openapi/spec/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE\ngo-openapi/strfmt,https://github.com/go-openapi/strfmt/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/strfmt/master/LICENSE\ngo-openapi/swag,https://github.com/go-openapi/swag/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE\ngo-openapi/validate,https://github.com/go-openapi/validate/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-openapi/validate/master/LICENSE\ngo-ozzo/ozzo-validation,https://github.com/go-ozzo/ozzo-validation/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/go-ozzo/ozzo-validation/master/LICENSE\ngo-stack/stack,https://github.com/go-stack/stack/blob/master/LICENSE.md,MIT License,https://raw.githubusercontent.com/go-stack/stack/master/LICENSE.md\ngodbus/dbus,https://github.com/godbus/dbus/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/godbus/dbus/master/LICENSE\ngogo/protobuf,https://github.com/gogo/protobuf/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/gogo/protobuf/master/LICENSE\ngolang/glog,https://github.com/golang/glog/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/golang/glog/master/LICENSE\ngolang/groupcache,https://github.com/golang/groupcache/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/golang/groupcache/master/LICENSE\ngolang/mock,https://github.com/golang/mock/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/golang/mock/master/LICENSE\ngolang/protobuf,https://github.com/golang/protobuf/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/protobuf/master/LICENSE\ngolangplus/bytes,https://github.com/golangplus/bytes/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golangplus/bytes/master/LICENSE\ngolangplus/fmt,https://github.com/golangplus/fmt/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golangplus/fmt/master/LICENSE\ngolangplus/testing,https://github.com/golangplus/testing/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golangplus/testing/master/LICENSE\ngoogle/btree,https://github.com/google/btree/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/google/btree/master/LICENSE\ngoogle/cadvisor,https://github.com/google/cadvisor/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/google/cadvisor/master/LICENSE\ngoogle/certificate-transparency-go,https://github.com/google/certificate-transparency-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/google/certificate-transparency-go/master/LICENSE\ngoogle/go-cmp,https://github.com/google/go-cmp/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/google/go-cmp/master/LICENSE\ngoogle/gofuzz,https://github.com/google/gofuzz/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/google/gofuzz/master/LICENSE\ngoogle/martian,https://github.com/google/martian/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/google/martian/master/LICENSE\ngoogle/pprof,https://github.com/google/pprof/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/google/pprof/master/LICENSE\ngoogle/renameio,https://github.com/google/renameio/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/google/renameio/master/LICENSE\ngoogle/uuid,https://github.com/google/uuid/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/google/uuid/master/LICENSE\ngoogleapis/gnostic,https://github.com/googleapis/gnostic/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/googleapis/gnostic/master/LICENSE\ngophercloud/gophercloud,https://github.com/gophercloud/gophercloud/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/gophercloud/gophercloud/master/LICENSE\ngopherjs/gopherjs,https://github.com/gopherjs/gopherjs/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/gopherjs/gopherjs/master/LICENSE\ngorilla/context,https://github.com/gorilla/context/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/gorilla/context/master/LICENSE\ngorilla/mux,https://github.com/gorilla/mux/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/gorilla/mux/master/LICENSE\ngorilla/websocket,https://github.com/gorilla/websocket/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/gorilla/websocket/master/LICENSE\ngregjones/httpcache,https://github.com/gregjones/httpcache/blob/master/LICENSE.txt,MIT License,https://raw.githubusercontent.com/gregjones/httpcache/master/LICENSE.txt\ngrpc-ecosystem/go-grpc-middleware,https://github.com/grpc-ecosystem/go-grpc-middleware/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/grpc-ecosystem/go-grpc-middleware/master/LICENSE\ngrpc-ecosystem/go-grpc-prometheus,https://github.com/grpc-ecosystem/go-grpc-prometheus/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/grpc-ecosystem/go-grpc-prometheus/master/LICENSE\ngrpc-ecosystem/grpc-gateway,https://github.com/grpc-ecosystem/grpc-gateway/blob/master/LICENSE.txt,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/master/LICENSE.txt\nhashicorp/go-cleanhttp,https://github.com/hashicorp/go-cleanhttp/blob/master/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/hashicorp/go-cleanhttp/master/LICENSE\nhashicorp/go-getter,https://github.com/hashicorp/go-getter/blob/master/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/hashicorp/go-getter/master/LICENSE\nhashicorp/go-safetemp,https://github.com/hashicorp/go-safetemp/blob/master/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/hashicorp/go-safetemp/master/LICENSE\nhashicorp/go-version,https://github.com/hashicorp/go-version/blob/master/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/hashicorp/go-version/master/LICENSE\nhashicorp/golang-lru,https://github.com/hashicorp/golang-lru/blob/master/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/hashicorp/golang-lru/master/LICENSE\nhashicorp/hcl,https://github.com/hashicorp/hcl/blob/master/LICENSE,Mozilla Public License 2.0,https://raw.githubusercontent.com/hashicorp/hcl/master/LICENSE\nheketi/heketi,https://github.com/heketi/heketi/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/heketi/heketi/master/LICENSE\nheketi/rest,https://github.com/heketi/rest/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/heketi/rest/master/LICENSE\nheketi/tests,https://github.com/heketi/tests/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/heketi/tests/master/LICENSE\nhpcloud/tail,https://github.com/hpcloud/tail/blob/master/LICENSE.txt,MIT License,https://raw.githubusercontent.com/hpcloud/tail/master/LICENSE.txt\nimdario/mergo,https://github.com/imdario/mergo/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/imdario/mergo/master/LICENSE\ninconshreveable/mousetrap,https://github.com/inconshreveable/mousetrap/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/inconshreveable/mousetrap/master/LICENSE\njmespath/go-jmespath,https://github.com/jmespath/go-jmespath/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/jmespath/go-jmespath/master/LICENSE\njonboulle/clockwork,https://github.com/jonboulle/clockwork/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/jonboulle/clockwork/master/LICENSE\njson-iterator/go,https://github.com/json-iterator/go/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/json-iterator/go/master/LICENSE\njstemmer/go-junit-report,https://github.com/jstemmer/go-junit-report/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/jstemmer/go-junit-report/master/LICENSE\njteeuwen/go-bindata,https://github.com/jteeuwen/go-bindata/blob/master/LICENSE,Public Domain Dedication,https://raw.githubusercontent.com/jteeuwen/go-bindata/master/LICENSE\njtolds/gls,https://github.com/jtolds/gls/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/jtolds/gls/master/LICENSE\njulienschmidt/httprouter,https://github.com/julienschmidt/httprouter/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/julienschmidt/httprouter/master/LICENSE\nkardianos/osext,https://github.com/kardianos/osext/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/kardianos/osext/master/LICENSE\nkarrick/godirwalk,https://github.com/karrick/godirwalk/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/karrick/godirwalk/master/LICENSE\nkisielk/errcheck,https://github.com/kisielk/errcheck/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/kisielk/errcheck/master/LICENSE\nkisielk/gotool,https://github.com/kisielk/gotool/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/kisielk/gotool/master/LICENSE\nkonsorten/go-windows-terminal-sequences,https://github.com/konsorten/go-windows-terminal-sequences/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/konsorten/go-windows-terminal-sequences/master/LICENSE\nkr/fs,https://github.com/kr/fs/blob/main/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/kr/fs/main/LICENSE\nkr/pretty,https://github.com/kr/pretty/blob/main/License,MIT License,https://raw.githubusercontent.com/kr/pretty/main/License\nkr/pty,https://github.com/kr/pty/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/kr/pty/master/LICENSE\nkr/text,https://github.com/kr/text/blob/main/License,MIT License,https://raw.githubusercontent.com/kr/text/main/License\nkubeflow/kubeflow,https://github.com/kubeflow/kubeflow/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubeflow/kubeflow/master/LICENSE\nkubernetes-sigs/application,https://github.com/kubernetes-sigs/application/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes-sigs/application/master/LICENSE\nlibopenstorage/openstorage,https://github.com/libopenstorage/openstorage/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/libopenstorage/openstorage/master/LICENSE\nliggitt/tabwriter,https://github.com/liggitt/tabwriter/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/liggitt/tabwriter/master/LICENSE\nlithammer/dedent,https://github.com/lithammer/dedent/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/lithammer/dedent/master/LICENSE\nlpabon/godbc,https://github.com/lpabon/godbc/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/lpabon/godbc/master/LICENSE\nmagiconair/properties,https://github.com/magiconair/properties/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/magiconair/properties/master/LICENSE\nmailru/easyjson,https://github.com/mailru/easyjson/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mailru/easyjson/master/LICENSE\nmarstr/guid,https://github.com/marstr/guid/blob/master/LICENSE.txt,MIT License,https://raw.githubusercontent.com/marstr/guid/master/LICENSE.txt\nmattn/go-colorable,https://github.com/mattn/go-colorable/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mattn/go-colorable/master/LICENSE\nmattn/go-isatty,https://github.com/mattn/go-isatty/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mattn/go-isatty/master/LICENSE\nmattn/go-runewidth,https://github.com/mattn/go-runewidth/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mattn/go-runewidth/master/LICENSE\nmattn/go-shellwords,https://github.com/mattn/go-shellwords/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mattn/go-shellwords/master/LICENSE\nmatttproud/golang_protobuf_extensions,https://github.com/matttproud/golang_protobuf_extensions/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/matttproud/golang_protobuf_extensions/master/LICENSE\nmesos/mesos-go,https://github.com/mesos/mesos-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/mesos/mesos-go/master/LICENSE\nmholt/caddy,https://github.com/caddyserver/caddy/blob/master/LICENSE.txt,Apache License 2.0,https://raw.githubusercontent.com/caddyserver/caddy/master/LICENSE.txt\nmiekg/dns,https://github.com/miekg/dns/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/miekg/dns/master/LICENSE\nmindprince/gonvml,https://github.com/mindprince/gonvml/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/mindprince/gonvml/master/LICENSE\nmistifyio/go-zfs,https://github.com/mistifyio/go-zfs/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/mistifyio/go-zfs/master/LICENSE\nmitchellh/go-homedir,https://github.com/mitchellh/go-homedir/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mitchellh/go-homedir/master/LICENSE\nmitchellh/go-testing-interface,https://github.com/mitchellh/go-testing-interface/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mitchellh/go-testing-interface/master/LICENSE\nmitchellh/go-wordwrap,https://github.com/mitchellh/go-wordwrap/blob/master/LICENSE.md,MIT License,https://raw.githubusercontent.com/mitchellh/go-wordwrap/master/LICENSE.md\nmitchellh/mapstructure,https://github.com/mitchellh/mapstructure/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mitchellh/mapstructure/master/LICENSE\nmodern-go/concurrent,https://github.com/modern-go/concurrent/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/modern-go/concurrent/master/LICENSE\nmodern-go/reflect2,https://github.com/modern-go/reflect2/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/modern-go/reflect2/master/LICENSE\nmohae/deepcopy,https://github.com/mohae/deepcopy/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/mohae/deepcopy/master/LICENSE\nmorikuni/aec,https://github.com/morikuni/aec/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/morikuni/aec/master/LICENSE\nmrunalp/fileutils,https://github.com/mrunalp/fileutils/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/mrunalp/fileutils/master/LICENSE\nmunnerz/goautoneg,https://github.com/munnerz/goautoneg/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/munnerz/goautoneg/master/LICENSE\nmvdan/xurls,https://github.com/mvdan/xurls/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/mvdan/xurls/master/LICENSE\nmwitkow/go-conntrack,https://github.com/mwitkow/go-conntrack/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/mwitkow/go-conntrack/master/LICENSE\nmxk/go-flowrate,https://github.com/mxk/go-flowrate/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/mxk/go-flowrate/master/LICENSE\nnatefinch/lumberjack,https://github.com/natefinch/lumberjack/blob/v2.0/LICENSE,MIT License,https://raw.githubusercontent.com/natefinch/lumberjack/v2.0/LICENSE\nonrik/logrus,https://github.com/onrik/logrus/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/onrik/logrus/master/LICENSE\nonsi/ginkgo,https://github.com/onsi/ginkgo/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/onsi/ginkgo/master/LICENSE\nonsi/gomega,https://github.com/onsi/gomega/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/onsi/gomega/master/LICENSE\nopencontainers/go-digest,https://github.com/opencontainers/go-digest/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/opencontainers/go-digest/master/LICENSE\nopencontainers/image-spec,https://github.com/opencontainers/image-spec/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/opencontainers/image-spec/master/LICENSE\nopencontainers/runc,https://github.com/opencontainers/runc/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/opencontainers/runc/master/LICENSE\nopencontainers/runtime-spec,https://github.com/opencontainers/runtime-spec/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/opencontainers/runtime-spec/master/LICENSE\nopencontainers/selinux,https://github.com/opencontainers/selinux/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/opencontainers/selinux/master/LICENSE\notiai10/copy,https://github.com/otiai10/copy/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/otiai10/copy/master/LICENSE\notiai10/curr,https://github.com/otiai10/curr/blob/master/LICENSE,Do What The Fuck You Want To Public License Version 2,https://raw.githubusercontent.com/otiai10/curr/master/LICENSE\notiai10/mint,https://github.com/otiai10/mint/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/otiai10/mint/master/LICENSE\npborman/uuid,https://github.com/pborman/uuid/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/pborman/uuid/master/LICENSE\npelletier/go-toml,https://github.com/pelletier/go-toml/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/pelletier/go-toml/master/LICENSE\npeterbourgon/diskv,https://github.com/peterbourgon/diskv/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/peterbourgon/diskv/master/LICENSE\npkg/errors,https://github.com/pkg/errors/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/pkg/errors/master/LICENSE\npkg/sftp,https://github.com/pkg/sftp/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/pkg/sftp/master/LICENSE\npmezard/go-difflib,https://github.com/pmezard/go-difflib/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/pmezard/go-difflib/master/LICENSE\npquerna/cachecontrol,https://github.com/pquerna/cachecontrol/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/pquerna/cachecontrol/master/LICENSE\npquerna/ffjson,https://github.com/pquerna/ffjson/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/pquerna/ffjson/master/LICENSE\nprometheus/client_golang,https://github.com/prometheus/client_golang/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/prometheus/client_golang/master/LICENSE\nprometheus/client_model,https://github.com/prometheus/client_model/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/prometheus/client_model/master/LICENSE\nprometheus/common,https://github.com/prometheus/common/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/prometheus/common/master/LICENSE\nprometheus/procfs,https://github.com/prometheus/procfs/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/prometheus/procfs/master/LICENSE\nquobyte/api,https://github.com/quobyte/api/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/quobyte/api/master/LICENSE\nremyoudompheng/bigfft,https://github.com/remyoudompheng/bigfft/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/remyoudompheng/bigfft/master/LICENSE\nrobfig/cron,https://github.com/robfig/cron/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/robfig/cron/master/LICENSE\nrogpeppe/go-charset,https://github.com/rogpeppe/go-charset/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/rogpeppe/go-charset/master/LICENSE\nrogpeppe/go-internal,https://github.com/rogpeppe/go-internal/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/rogpeppe/go-internal/master/LICENSE\nrubiojr/go-vhd,https://github.com/rubiojr/go-vhd/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/rubiojr/go-vhd/master/LICENSE\nrussross/blackfriday,https://github.com/russross/blackfriday/blob/master/LICENSE.txt,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/russross/blackfriday/master/LICENSE.txt\nsatori/go.uuid,https://github.com/satori/go.uuid/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/satori/go.uuid/master/LICENSE\nseccomp/libseccomp-golang,https://github.com/seccomp/libseccomp-golang/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/seccomp/libseccomp-golang/master/LICENSE\nshurcooL/sanitized_anchor_name,https://github.com/shurcooL/sanitized_anchor_name/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/shurcooL/sanitized_anchor_name/master/LICENSE\nsigma/go-inotify,https://github.com/sigma/go-inotify/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/sigma/go-inotify/master/LICENSE\nsirupsen/logrus,https://github.com/sirupsen/logrus/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/sirupsen/logrus/master/LICENSE\nsmartystreets/assertions,https://github.com/smartystreets/assertions/blob/master/LICENSE.md,MIT License,https://raw.githubusercontent.com/smartystreets/assertions/master/LICENSE.md\nsmartystreets/goconvey,https://github.com/smartystreets/goconvey/blob/master/LICENSE.md,MIT License,https://raw.githubusercontent.com/smartystreets/goconvey/master/LICENSE.md\nsoheilhy/cmux,https://github.com/soheilhy/cmux/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/soheilhy/cmux/master/LICENSE\nspf13/afero,https://github.com/spf13/afero/blob/master/LICENSE.txt,Apache License 2.0,https://raw.githubusercontent.com/spf13/afero/master/LICENSE.txt\nspf13/cast,https://github.com/spf13/cast/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/spf13/cast/master/LICENSE\nspf13/cobra,https://github.com/spf13/cobra/blob/master/LICENSE.txt,Apache License 2.0,https://raw.githubusercontent.com/spf13/cobra/master/LICENSE.txt\nspf13/jwalterweatherman,https://github.com/spf13/jwalterweatherman/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/spf13/jwalterweatherman/master/LICENSE\nspf13/pflag,https://github.com/spf13/pflag/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/spf13/pflag/master/LICENSE\nspf13/viper,https://github.com/spf13/viper/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/spf13/viper/master/LICENSE\nstorageos/go-api,https://github.com/storageos/go-api/blob/master/LICENCE,MIT License,https://raw.githubusercontent.com/storageos/go-api/master/LICENCE\nstretchr/objx,https://github.com/stretchr/objx/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/stretchr/objx/master/LICENSE\nstretchr/testify,https://github.com/stretchr/testify/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/stretchr/testify/master/LICENSE\nsyndtr/gocapability,https://github.com/syndtr/gocapability/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/syndtr/gocapability/master/LICENSE\ntmc/grpc-websocket-proxy,https://github.com/tmc/grpc-websocket-proxy/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/tmc/grpc-websocket-proxy/master/LICENSE\nugorji/go,https://github.com/ugorji/go/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/ugorji/go/master/LICENSE\nulikunitz/xz,https://github.com/ulikunitz/xz/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/ulikunitz/xz/master/LICENSE\nurfave/negroni,https://github.com/urfave/negroni/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/urfave/negroni/master/LICENSE\nvishvananda/netlink,https://github.com/vishvananda/netlink/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/vishvananda/netlink/master/LICENSE\nvishvananda/netns,https://github.com/vishvananda/netns/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/vishvananda/netns/master/LICENSE\nvmware/govmomi,https://github.com/vmware/govmomi/blob/master/LICENSE.txt,Apache License 2.0,https://raw.githubusercontent.com/vmware/govmomi/master/LICENSE.txt\nvmware/photon-controller-go-sdk,https://github.com/vmware/photon-controller-go-sdk/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/vmware/photon-controller-go-sdk/master/LICENSE\nxanzy/go-cloudstack,https://github.com/xanzy/go-cloudstack/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/xanzy/go-cloudstack/master/LICENSE\nxiang90/probing,https://github.com/xiang90/probing/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/xiang90/probing/master/LICENSE\nxlab/handysort,https://github.com/xlab/handysort/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/xlab/handysort/master/LICENSE\nxordataexchange/crypt,https://github.com/xordataexchange/crypt/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/xordataexchange/crypt/master/LICENSE\ncensus-instrumentation/opencensus-go,https://github.com/census-instrumentation/opencensus-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/census-instrumentation/opencensus-go/master/LICENSE\nuber-go/atomic,https://github.com/uber-go/atomic/blob/master/LICENSE.txt,MIT License,https://raw.githubusercontent.com/uber-go/atomic/master/LICENSE.txt\nuber-go/multierr,https://github.com/uber-go/multierr/blob/master/LICENSE.txt,MIT License,https://raw.githubusercontent.com/uber-go/multierr/master/LICENSE.txt\nuber-go/tools,https://github.com/uber-go/tools/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/uber-go/tools/master/LICENSE\nuber-go/zap,https://github.com/uber-go/zap/blob/master/LICENSE.txt,MIT License,https://raw.githubusercontent.com/uber-go/zap/master/LICENSE.txt\ngolang/crypto,https://github.com/golang/crypto/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/crypto/master/LICENSE\ngolang/exp,https://github.com/golang/exp/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/exp/master/LICENSE\ngolang/image,https://github.com/golang/image/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/image/master/LICENSE\ngolang/mobile,https://github.com/golang/mobile/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/mobile/master/LICENSE\ngolang/mod,https://github.com/golang/mod/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/mod/master/LICENSE\ngolang/net,https://github.com/golang/net/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/net/master/LICENSE\ngolang/oauth2,https://github.com/golang/oauth2/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/oauth2/master/LICENSE\ngolang/sync,https://github.com/golang/sync/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/sync/master/LICENSE\ngolang/sys,https://github.com/golang/sys/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/sys/master/LICENSE\ngolang/text,https://github.com/golang/text/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/text/master/LICENSE\ngolang/time,https://github.com/golang/time/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/time/master/LICENSE\ngolang/tools,https://github.com/golang/tools/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/tools/master/LICENSE\ngolang/xerrors,https://github.com/golang/xerrors/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/golang/xerrors/master/LICENSE\ngomodules/jsonpatch,https://github.com/gomodules/jsonpatch/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/gomodules/jsonpatch/master/LICENSE\ngonum/gonum,https://github.com/gonum/gonum/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/gonum/gonum/master/LICENSE\ngonum/netlib,https://github.com/gonum/netlib/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/gonum/netlib/master/LICENSE\ngoogle/google-api-go-client,https://github.com/googleapis/google-api-go-client/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/googleapis/google-api-go-client/master/LICENSE\ngolang/appengine,https://github.com/golang/appengine/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/golang/appengine/master/LICENSE\ngoogle/go-genproto,https://github.com/googleapis/go-genproto/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/googleapis/go-genproto/master/LICENSE\ngrpc/grpc-go,https://github.com/grpc/grpc-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/grpc/grpc-go/master/LICENSE\nairbrake/gobrake,https://github.com/airbrake/gobrake/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/airbrake/gobrake/master/LICENSE\nalecthomas/kingpin,https://github.com/alecthomas/kingpin/blob/master/COPYING,MIT License,https://raw.githubusercontent.com/alecthomas/kingpin/master/COPYING\ngo-check/check,https://github.com/go-check/check/blob/v1/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/go-check/check/v1/LICENSE\ngo-errgo/errgo,https://github.com/go-errgo/errgo/blob/v1/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/go-errgo/errgo/v1/LICENSE\ngo-gcfg/gcfg,https://github.com/go-gcfg/gcfg/blob/v1/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/go-gcfg/gcfg/v1/LICENSE\ngemnasium/logrus-airbrake-hook,https://github.com/gemnasium/logrus-airbrake-hook/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/gemnasium/logrus-airbrake-hook/master/LICENSE\ngo-inf/inf,https://github.com/go-inf/inf/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/go-inf/inf/master/LICENSE\nsquare/go-jose,https://github.com/square/go-jose/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/square/go-jose/master/LICENSE\nsrc-d/go-billy,https://github.com/src-d/go-billy/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/src-d/go-billy/master/LICENSE\nsrc-d/go-git-fixtures,https://github.com/src-d/go-git-fixtures/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/src-d/go-git-fixtures/master/LICENSE\nsrc-d/go-git,https://github.com/src-d/go-git/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/src-d/go-git/master/LICENSE\ngo-tomb/tomb,https://github.com/go-tomb/tomb/blob/v1/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/go-tomb/tomb/v1/LICENSE\ngo-warnings/warnings,https://github.com/go-warnings/warnings/blob/master/LICENSE,BSD 2-Clause \"Simplified\" License,https://raw.githubusercontent.com/go-warnings/warnings/master/LICENSE\ngo-yaml/yaml,https://github.com/go-yaml/yaml/blob/v2/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/go-yaml/yaml/v2/LICENSE\ngotestyourself/gotest.tools,https://github.com/gotestyourself/gotest.tools/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/gotestyourself/gotest.tools/master/LICENSE\ngo4org/grpc,https://github.com/go4org/grpc/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://raw.githubusercontent.com/go4org/grpc/master/LICENSE\ndominikh/go-tools,https://github.com/dominikh/go-tools/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/dominikh/go-tools/master/LICENSE\nkubernetes/api,https://github.com/kubernetes/api/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/api/master/LICENSE\nkubernetes/apiextensions-apiserver,https://github.com/kubernetes/apiextensions-apiserver/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/apiextensions-apiserver/master/LICENSE\nkubernetes/apimachinery,https://github.com/kubernetes/apimachinery/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/apimachinery/master/LICENSE\nkubernetes/apiserver,https://github.com/kubernetes/apiserver/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/apiserver/master/LICENSE\nkubernetes/cli-runtime,https://github.com/kubernetes/cli-runtime/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/cli-runtime/master/LICENSE\nkubernetes/client-go,https://github.com/kubernetes/client-go/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/client-go/master/LICENSE\nkubernetes/cloud-provider,https://github.com/kubernetes/cloud-provider/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/cloud-provider/master/LICENSE\nkubernetes/cluster-bootstrap,https://github.com/kubernetes/cluster-bootstrap/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/cluster-bootstrap/master/LICENSE\nkubernetes/code-generator,https://github.com/kubernetes/code-generator/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/code-generator/master/LICENSE\nkubernetes/component-base,https://github.com/kubernetes/component-base/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/component-base/master/LICENSE\nkubernetes/cri-api,https://github.com/kubernetes/cri-api/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/cri-api/master/LICENSE\nkubernetes/csi-translation-lib,https://github.com/kubernetes/csi-translation-lib/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/csi-translation-lib/master/LICENSE\nkubernetes/gengo,https://github.com/kubernetes/gengo/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/gengo/master/LICENSE\nkubernetes/heapster,https://github.com/kubernetes-retired/heapster/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes-retired/heapster/master/LICENSE\nkubernetes/klog,https://github.com/kubernetes/klog/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/klog/master/LICENSE\nkubernetes/kube-aggregator,https://github.com/kubernetes/kube-aggregator/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/kube-aggregator/master/LICENSE\nkubernetes/kube-controller-manager,https://github.com/kubernetes/kube-controller-manager/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/kube-controller-manager/master/LICENSE\nkubernetes/kube-openapi,https://github.com/kubernetes/kube-openapi/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/kube-openapi/master/LICENSE\nkubernetes/kube-proxy,https://github.com/kubernetes/kube-proxy/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/kube-proxy/master/LICENSE\nkubernetes/kube-scheduler,https://github.com/kubernetes/kube-scheduler/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/kube-scheduler/master/LICENSE\nkubernetes/kubelet,https://github.com/kubernetes/kubelet/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/kubelet/master/LICENSE\nkubernetes/kubernetes,https://github.com/kubernetes/kubernetes/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/kubernetes/master/LICENSE\nkubernetes/legacy-cloud-providers,https://github.com/kubernetes/legacy-cloud-providers/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/legacy-cloud-providers/master/LICENSE\nkubernetes/metrics,https://github.com/kubernetes/metrics/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/metrics/master/LICENSE\nkubernetes/repo-infra,https://github.com/kubernetes/repo-infra/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/repo-infra/master/LICENSE\nkubernetes/sample-apiserver,https://github.com/kubernetes/sample-apiserver/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/sample-apiserver/master/LICENSE\nkubernetes/utils,https://github.com/kubernetes/utils/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes/utils/master/LICENSE\nkubernetes-sigs/controller-runtime,https://github.com/kubernetes-sigs/controller-runtime/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/master/LICENSE\nkubernetes-sigs/kustomize,https://github.com/kubernetes-sigs/kustomize/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/LICENSE\nkubernetes-sigs/structured-merge-diff,https://github.com/kubernetes-sigs/structured-merge-diff/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes-sigs/structured-merge-diff/master/LICENSE\nkubernetes-sigs/testing_frameworks,https://github.com/kubernetes-sigs/testing_frameworks/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/kubernetes-sigs/testing_frameworks/master/LICENSE\nkubernetes-sigs/yaml,https://github.com/kubernetes-sigs/yaml/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/kubernetes-sigs/yaml/master/LICENSE\nsourcegraph/go-diff,https://github.com/sourcegraph/go-diff/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/sourcegraph/go-diff/master/LICENSE\nsqs/pbtypes,https://github.com/sqs/pbtypes/blob/master/LICENSE,Apache License 2.0,https://raw.githubusercontent.com/sqs/pbtypes/master/LICENSE\nfvbommel/util,https://github.com/fvbommel/util/blob/master/LICENSE,MIT License,https://raw.githubusercontent.com/fvbommel/util/master/LICENSE\nbitbucket.org/bertimus9/systemstat,https://bitbucket.org/bertimus9/systemstat/src/master/LICENSE,MIT License,https://bitbucket.org/bertimus9/systemstat/src/master/LICENSE\nmodernc.org/cc,https://gitlab.com/cznic/cc/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://gitlab.com/cznic/cc/blob/master/LICENSE\nmodernc.org/golex,https://gitlab.com/cznic/golex/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://gitlab.com/cznic/golex/blob/master/LICENSE\nmodernc.org/mathutil,https://gitlab.com/cznic/mathutil/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://gitlab.com/cznic/mathutl/blob/master/LICENSE\nmodernc.org/strutil,https://gitlab.com/cznic/strutil/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://gitlab.com/cznic/strutil/blob/master/LICENSE\nmodernc.org/xc,https://gitlab.com/cznic/xc/blob/master/LICENSE,BSD 3-Clause \"New\" or \"Revised\" License,https://gitlab.com/cznic/xc/blob/master/LICENSE\nheketi/utils,https://github.com/heketi/heketi/blob/master/LICENSE,Apache License 2.0,https://github.com/heketi/heketi/blob/master/LICENSE\nkr/logfmt,https://github.com/kr/logfmt/blob/master/Readme,MIT License,https://github.com/kr/logfmt/blob/master/Readme\n"
  }
]